首先打开豆瓣官网,并打开 chrome 的开发者工具,选中 network 选项卡,然后选中 preserve log 选项,这样在跳转页面的时候就不会刷掉之前的请求。不然登录之后处理登录的请求就会被刷新掉从而无法获取。当然,这里也有一个更方便的方法,就是在输入密码的时候输错一位(当然,全部输错也可以),然后发现一个 basic 请求,打开这个请求的详细信息,发现这是一个 POST 请求,也就是处理我们登录的请求。
在请求头中包含了 Cookie, Host, Origin, Referer, User-Agent 等信息,Form Data 中包含了五个字段,其中 ck 和 ticket 两个字段为空,可以不用管,name 和 password 分别是用户名和密码,需要输入自己的用户名和密码,remember 是一个布尔值,是是否保存密码。
既然请求已经分析完毕,那么只需要使用 requests.Session 就可以完成模拟登录了。
首先引入相关库
import re
import requests
from lxml import etree
然后创建一个 Login 类,用来模拟登录豆瓣,将请求头信息以及 requests.Session 对象都封装为实例属性,并将请求登录的 URL 和 登录后访问的 URL 一并写为实例属性。
def __init__(self):
# 设置请求头
self.headers = {
'Referer': 'https://accounts.douban.com/passport/login_popup?login_source=anony',
'Host': 'accounts.douban.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
# 使用 requests.Session 模拟登录
self.session = requests.Session()
# 请求登录的 URL
self.post_url = 'https://accounts.douban.com/j/mobile/login/basic'
# 登录成功之后访问的 URL
self.logined_url = '