下面是关于“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技术站