我用 python 做爬虫爬过不少数据,比如在 google play 爬应用信息;在 instragram, 500px 爬图片;当然爬虫的作用不止于此,比如定时去某个网站签到,妈妈再也不用担心我忘记签到了
这些网站支持游客访问,但要访问特定内容,比如你收藏的图片,或者要签到,那前提是要登录。
现在的网站登录验证是越来越复杂了,且不说那些真人都挠头的验证码,就算是不需要验证码的网站,也各出奇招,像 gitee 是通过前端加密登录信息,而 instagram 则是通过 url 里的 query_hash 以及 header 里的 X-CSRFToken,X-Instagram-GIS 来做校验,对爬虫很不友好,都不是那么容易登录进去的
直接发送账号密码到登录接口
有些淳朴的网站,其登录校验只要提供帐号密码就行,通过浏览器抓包看下数据格式,然后照样发起请求,就可以了
比如 500px,其登录验证几乎没有难度,代码如下
# -*- coding: utf-8 -*-
import requests
import json
from profile import email, password
session = requests.session()
if __name__ == '__main__':
url = 'https://api.500px.com/v1/session'
data = {
'session':
{
'email': email,
'password': password
}
}
headers = {'Content-Type': 'application/json'}
result = session.post(url, data=json.dumps(data), headers=headers)
print(result.text)
登录成功后,网站会向客户端写入 cookie,后续访问就一路畅通了,在 python 里则意味着我们需要用 session 发起后续请求
复杂的登录校验
这次以 gitee 为例,来研究下如何登录,先用浏览器抓包看下 gitee 的登录
gitee 登录地址
gitee 登录数据
可以看到要登录 gitee,请求参数里有 authenticity_token 和 加密后的 password
这个 token 怎么来的?根据经验判断应该是藏在 gitee 登录页某处,感觉不难获取;关键是这个 password 的加密,应该是某个 js 脚本的功劳,不过要逆向出 js 是如何加密的,的确是非常困难的。。。毕竟我们不是 js 执行引擎
如果无法逆向出这个加密算法,要怎么登录呢?可以先用浏览器登录,再把 cookie 复制出来给爬虫使用
首先是复制 cookie,浏览器登录 gitee 成功后,随意抓个包就可以得到 cookie 了
gitee cookie
复制下来的 cookie 设置到爬虫里,代码如下
# -*- coding: utf-8 -*-
import requests
session = requests.session()
if __name__ == '__main__':
headers = {
'Host': 'gitee.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
'Accept': 'application/json',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
}
url = 'https://gitee.com/api/v3/internal/my_resources'
result = session.get(url=url, headers=headers)
if result.status_code == 200:
print('success: \n%s' % (result.text))
else:
print(result.status_code)
headers['Cookie'] = '......'
result = session.get(url=url, headers=headers)
if result.status_code == 200:
print('success: \n%s' % (result.text))
else:
print(result.status_code)
执行结果如下
// 未设置 cookie 返回 401
401
// 设置 cookie 后返回数据
success:
{"enterprises_count":0...}
可见,使用浏览器的 cookie 就可以达到爬虫免登录的效果了
程序自动获取 cookie
浏览器抓包再复制 cookie 到爬虫代码,感觉有点 low,实际上 cookie 是保存在我们电脑上的,这样浏览器才能做到记住登录状态功能
那么可以让爬虫自己读取浏览器 cookie,从而避免我们抓包再复制吗?答案是肯定的,考虑到文章篇幅,我将在下一篇文章里介绍如何用代码读取浏览器已存储 cookie 来进行登录,敬请期待