之前尝试用requests直接请求登录失败了,都是直接用selenium简单粗暴的登录。今天看了看大佬《网络爬虫开发实战》模拟登录部分,又收获不少。
利用requests模拟登陆的关键:
第一:是要找到相应的请求地址
第二:找到要请求头中对应的提交表单Form Data的各种字段,以及他们的值
第一步:是要找到相应的请求地址
拿豆瓣为例,在登录界面时别输入用户名密码或者输入错误的用户名密码,然后点击登录,然后在网络请求中找到相应的登录地址
network中这么多地址怎么分辨哪个是咱们想要的请求,我的技巧就是看哪个请求中带Form Data,如下图:
下图的basic对应的request url:https://accounts.douban.com/j/mobile/login/basic
就是我们想要的请求地址了
第二步: 找到要请求头中对应的提交表单Form Data的各种字段,以及他们的值
还看这张图:
一共有五个字段:
ck:含义未知,填空字符串
name:用户名
password:登录密码
remember:是否记录密码,true or flase都行
ticket:含义未知,填空字符
两个关键步骤搞定了,可以上代码了
import requests
from lxml import etree
class DouLogin(object):
def __init__(self):
self.headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'}
self.login_url = 'https://accounts.douban.com/j/mobile/login/basic'
self.logined_url = 'https://www.douban.com/'
self.session = requests.Session()
def login(self, email, password):
post_data = {
'ck': '', # 可选
'name': email,
'password': password,
'ticket': '', # 可选
}
response = self.session.post(self.login_url, data=post_data, headers=self.headers)
if response.status_code == 200 and response.json().get('status') == 'success':
response = self.session.get(self.logined_url)
selector = etree.HTML(response.text)
username = selector.xpath("//li[@class='nav-user-account']/a/span/text()")[0]
print('登录成功:这是%s' % username)
else:
print('登录失败:%s' % response.json().get('description'))
if __name__ == "__main__":
login = DouLogin()
login.login(email='[email protected]', password='xxx')
登录成功输出结果:
登录成功:这是xxx的帐号
登录失败输出结果:
登录失败:需要图形验证码
ps:有时候可能会失败,因为要二次滑动验证,这个暂时处理
pps:尝试登陆github失败了,他的Form Data里面的字段比较多,估计是哪个没设置对,还是selenium大法简答粗暴