当前位置:AIGC资讯 > 数据采集 > 正文

python爬虫——模拟登陆

参考链接:https://blog.csdn.net/weixin_39875941/article/details/109878457

模拟登陆

Python网络爬虫应用十分广泛,但是有些网页需要用户登陆后才能获取到信息,这时爬虫需要模拟用户的登陆行为,在登陆以后保存登陆信息,以便浏览该页面下的其他页面。

保存登陆信息的方法

模拟登陆后有两种方法可以保存用户登陆信息:

通过Session来保存登陆信息
import requests

# 初始化session
session = requests.Session()

# 通过session来请求网页
response = session.post(url, headers=headers)
通过Cookie来保存登陆信息
import http.cookiejar, urllib.request

# 初始化cookie和opener
cookie = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))

# 把opener配置为全局,当然也可以不配置全局
urllib.request.install_opener(opener)

# 通过opener来请求网页
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request) # 或者 response = opener.open(request)

模拟登陆实践

以豆瓣网为例模拟用户登陆,然后爬取登陆后的用户界面。

(1)找到请求的URL和请求表单

登陆一般是通过POST请求来实现的,其传递参数为一个请求表单,如果要成功登陆,我们需要查看该表单传递了哪些内容,然后构造表单做POST请求。想要获取表单提交到的地址和表单内容,只需要打开登录页面,输入用户名和密码,打开开发者工具,将NetWork里的Preserve Log选项勾选上(表示显示持续日志),再点击登录按钮,这时便会看到开发者工具下方显示了各个请求过程;点击第一个请求(一般为login),进入其详情页面,在Headers里就可以看到请求的URL和请求方式为POST,在Payload里就可以看到Form Data即表单的内容。
请求的URL和请求方式:

请求表单:

(2)设置请求表头和请求的URL

设置请求表头,即给请求添加Headers,这是为了伪装成浏览器进行登录。

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}
url_login = 'https://accounts.douban.com/login'
(3)设置请求表单

对于表单中的静态值,可以通过右键页面检查页面源代码获得;对于表单中的动态信息,则需要手动获取。

form_data = {
'redir': 'https://www.douban.com',
'form_email': '账号',
'form_password': '密码',
'login': u'登陆'
}
(4)获取验证码

如果登陆需要验证码,那么第(2)步的表单其实还不完整,还差两条跟验证码有关的信息,这两条信息是动态变化的,所以要手动获取。

response = session.post(url_login, headers=headers)
content = response.text
soup = BeautifulSoup(content, 'html.parser')
captcha = soup.find('img', id='captcha_image') # 当登陆需要验证码的时候
if captcha:
	captcha_url = captcha['src']
	re_captcha_id = response'
	captcha_id = re.findall(re_captcha_id, content)
print(captcha_id)
print(captcha_url) # 打印验证码url
captcha_text = input('Please input the captcha:') # 手动输入验证码
formdata['captcha-solution'] = captcha_text # 添加表单信息
formdata['captcha-id'] = captcha_id
(5)登录

将表单信息传入参数中请求页面即可登录。

response = session.post(url_login, data=form_data, headers=headers)
完整代码
# -*- coding: utf-8 -*-
import requests
import re
from bs4 import BeautifulSoup

# 初始化Session对象,利用session维持一个会话
session = requests.Session()

# 设置请求表头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}

# 设置请求的URL
url_login = 'https://accounts.douban.com/login'

# 设置请求表单
form_data = {
'redir': 'https://www.douban.com',
'form_email': '账号',
'form_password': '密码',
'login': u'登陆'
}

# 用Session对象的post()方法模拟登录
response = session.post(url_login, data=form_data, headers=headers)

# 当登陆需要验证码的时候,获取验证码
content = response.text
soup = BeautifulSoup(content, 'html.parser')
captcha = soup.find('img', id='captcha_image')
if captcha:
	captcha_url = captcha['src']
	re_captcha_id = response'
	captcha_id = re.findall(re_captcha_id, content)
print(captcha_id)
print(captcha_url)
captcha_text = input('Please input the captcha:')
form_data['captcha-solution'] = captcha_text
form_data['captcha-id'] = captcha_id

response = session.post(url_login, data=form_data, headers=headers)

with open('contacts.html', 'w+', encoding='utf-8') as f:
	f.write(response.text)

更新时间 2023-11-08