python 爬虫网页登陆的简单实现

下面是关于“python 爬虫网页登陆的简单实现”的完整攻略:

1. 背景介绍

爬虫一般需要模拟登陆才能爬取需要登录后才能获取的信息,例如淘宝、京东等电商类网站。Python作为一门较为流行的语言之一,它提供了许多优秀的库和模块用于爬虫操作,其中最为著名的是requests模块。本文将以requests模块为例,介绍如何利用Python实现网页登陆。

2. 实现步骤

针对网站登陆,一般需要以下几个步骤:

2.1 获取网站的Cookie值

使用requests模块访问网站时,网站会自动对你的浏览器设置Cookie,以此来识别你的身份。因此,首先需要获取网站的Cookie值。可以通过Chrome浏览器的开发者工具,在“网络”选项卡中查看到Cookie值。

2.2 构造headers

requests模块需要一个包含User-Agent、Cookie等信息的字典来模拟浏览器发送请求。User-Agent是模拟浏览器时必须设置的一个关键信息,Cookie则可以在之前获取。

例如,代码如下:

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.37',
    'Cookie':'xxxxxxx'
}

2.3 模拟登陆

接下来可以使用requests模块向网站发送post请求,模拟登陆操作。

例如,假设需要登陆的网站是https://example.com,登陆接口为https://example.com/login,用户名为username,密码为password,那么代码如下:

import requests

login_url = 'https://example.com/login'
data = {'username': 'xxxxx', 'password': 'xxxxx'}
session = requests.Session()
session.post(login_url, headers=headers, data=data)

这里通过requests.Session()创建了一个session对象,调用post方法向登陆接口发送请求。headers参数携带了之前获取到的Cookie值。

2.4 验证登陆是否成功

登陆之后,可以进一步请求需要登陆后才能访问的页面,验证登陆是否成功。如果登陆成功,响应内容应该包含用户昵称、用户订单等信息;如果登陆失败,则会提示“登录失败”等信息。

3. 示例说明

下面,我们来通过两个网站的具体实现,进一步说明入门级爬虫模拟登陆流程。

3.1 豆瓣网

模拟登陆豆瓣网需要提交的信息有关键词wd、账号form_email以及密码form_password,因此请求参数如下:

payload = {'wd': keyword, 'form_email': username, 'form_password':password}

完整代码如下:

import requests

# 登陆接口
login_url = 'https://accounts.douban.com/j/mobile/login/basic'
# 构造headers
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.37',
    'Cookie':'xxxxxxx'
}
# 请求登陆接口
payload = {'wd': keyword, 'form_email': username, 'form_password':password}
session = requests.Session()
session.post(login_url, headers=headers, data=payload)
# 验证登陆
response = session.get('https://www.douban.com/people/xxxxxx/')
if response.status_code == 200:
    print('登陆成功')
else:
    print('登陆失败')

3.2 网易163邮箱

网易邮箱模拟登陆场景稍微复杂一些,需要发送一次get请求,获取一些参数,再将这些参数加密,最后提交post请求登陆。完整代码如下:

import requests
import re
import time
import hashlib

# 用户名和密码
username = 'xxxxx'
password = 'xxxxx'

# 登陆获取cookie和参数
session = requests.session()
url = 'https://mail.163.com/'
res = session.get(url)
pattern1 = 'window\.location\.replace\("(.*?)"\);'
targetUrl = re.findall(pattern1, res.text)[0]
res = session.get(targetUrl)
pattern2 = 'name="savelogin"\s*value="(\w+)"'
savelogin = re.findall(pattern2, res.text)[0]
pattern3 = 'name="nonce"\s*id=".*?"\s*value="(\w+)"'
nonce = re.findall(pattern3, res.text)[0]
pattern4 = 'name="rsa"\s*value="(\w+)"'
rsa = re.findall(pattern4, res.text)[0]

# 登陆参数加密
tm = int(time.time()*1000)
rsaValue = str(tm) + '\t' + nonce + '\n' + password
keyUtil = ''
keyUtil += '00' 
keyUtil += '02' 
keyUtil += '03'*(64 - len(rsaValue)//16) 
keyUtil += chr(16- len(rsaValue)%16)*16
cipher = ''
key = rsa.encode('utf-8')
for i in range(0, len(rsaValue), 64):
    if(i == 0):
        ibyte = key + int(keyUtil.encode('utf-8'), 16).to_bytes(64, 'big')
    else:
        ibyte = rsaValue[i - 64:i] + int(keyUtil.encode('utf-8'), 16).to_bytes(64, 'big')
    text = int.from_bytes(ibyte, 'big')
    cipher = cipher + pow(text, 65537, int('010001', 16)).to_bytes(256, 'big').hex()

# 构造请求参数并发起post请求
data = {
    'username': username,
    'savelogin': savelogin,
    'url2': 'http://mail.163.com/errorpage/error163.htm',
    'password': '',
    'lightweight': 'true',
    'product': 'mail163',
    'type': '4',
    'iframe': '1',
    'stylename': 'mail163',
    'd': str(tm),
    'topURL': 'http://mail.163.com/',
    'rtid': '',
    'login_email': '',
    'login_password': '',
    'auto_login': "0",
    'show_name': '',
    'authtype': '',
    'mail_psc': '',
    'nav': '',
    'css': '',
    'id_cryptotool_password': cipher
}
response = session.post('https://mail.163.com/entry/cgi/ntesdoor?', headers=headers, data=data)

# 验证登陆
if response.status_code == 200:
    print('登陆成功')
else:
    print('登陆失败')

以上就是本文的全部内容,希望对初学者能有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 爬虫网页登陆的简单实现 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python爬虫框架scrapy代理中间件掌握学习教程

    Python爬虫框架Scrapy代理中间件掌握学习教程 在进行爬虫开发时,经常需要使用代理来避免IP被封锁或者提高爬取效率。而Scrapy是一个功能强大的Python爬虫框架,也提供了代理中间件这一强大的功能以支持代理。 代理中间件的使用方法 Scrapy提供了一个内置的代理中间件,可以通过在项目设置中设置代理中间件的位置及相应的参数,来让Scrapy使用代…

    python 2023年6月3日
    00
  • Python机器学习入门(四)之Python选择模型

    让我来为你详细讲解“Python机器学习入门(四)之Python选择模型”的完整攻略。这篇攻略主要是讲解如何选择合适的机器学习模型。 1. 数据预处理 在选择模型之前,首先需要对数据进行预处理。包括对数据进行清洗、去重、缺失值处理、特征提取等操作。我们可以使用Pandas库来完成这些操作。 #导入Pandas库 import pandas as pd #加载…

    python 2023年6月3日
    00
  • 通过OpenCV实现对指定颜色的物体追踪

    实现对指定颜色的物体追踪主要分为以下几步: 使用OpenCV读取视频,并对读取的帧进行预处理,转换为HSV色彩空间。 import cv2 # 读取视频 cap = cv2.VideoCapture(‘test.mp4’) while cap.isOpened(): ret, frame = cap.read() if not ret: break # 转换…

    python 2023年6月3日
    00
  • python爬虫学习——文件操作,异常处理

    文件操作 ”’ f = open(“a.txt”,”w”) #打开一个文件, w模式(写),如果文件不存在就在当前目录下创建 f.write(“hello world,i am here”) #将字符串写入文件中 f.close() #关闭文件 ”’ ”’ #read方法:读取指定的字符,开始定位在文件的开头,每执行一次,就向后移动指定的字符数 f =…

    爬虫 2023年4月8日
    00
  • python实现单例的两种方法解读

    当我们需要在程序中创建一个对象,并且要保证该对象在整个程序中只有一个实例时,就需要使用单例模式。在Python中,可以通过多种方法实现单例模式。本篇攻略将详细讲解Python实现单例的两种方法。 方法一:装饰器实现单例 在Python中,装饰器通常用于修饰函数或类,以增强它们的功能。我们可以使用装饰器修饰一个类,以使该类成为单例。其具体实现代码如下: def…

    python 2023年5月19日
    00
  • 在 Python 中,如何在另一个 py 文件的 [if __name__ == ‘__main__’] 中调用子程序?

    【问题标题】:In Python, how to invoke subroutine inside [if __name__ == ‘__main__’] of another py file?在 Python 中,如何在另一个 py 文件的 [if __name__ == ‘__main__’] 中调用子程序? 【发布时间】:2023-04-01 11:2…

    Python开发 2023年4月8日
    00
  • 解决jupyter notebook显示不全出现框框或者乱码问题

    针对“解决jupyter notebook显示不全出现框框或者乱码问题”这个问题,可以有以下几个步骤: 步骤一:查看当前环境字符集编码 在Jupyter Notebook中,可以使用以下代码获取当前环境的字符集编码: import sys print(sys.getdefaultencoding()) 运行后如果输出结果为utf-8则表明当前环境为UTF-8…

    python 2023年5月20日
    00
  • 详解Python PIL putpixel()方法

    putpixel()是Python PIL库中一个用于将指定像素点设置为特定颜色的方法。它的函数原型如下所示: putpixel(xy, value) 其中,xy是指定像素点的坐标,value是颜色值。坐标需要使用左上角为原点的坐标系统,即(0, 0)为左上角。 下面我们将详细介绍Python PIL库中putpixel()方法的使用方法,并且提供两个示例说…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部