Python爬虫实战E02带验证码的登录爬取图文教程

2024-12-31阅读数:75
上一篇:Python爬虫实战E03无序号翻页图文教程
下一篇:Python爬虫实战E01用户名密码登录爬取后台数据图文教程

打开Python爬虫实战练习页面带验证码的登录爬取_E02_Spiderbuf,只看到一个登录页面,而且是带验证码的。尝试一下不输入验证码直接点击登录,发现不行。

我们在E01-用户名密码登录爬取后台数据当中试过抓包取得用户名密码后直接在Python爬虫代码中把用户名密码传输到后台登录成功的,但现在有验证码这个方法就不好用了。

很多人看到验证码,第一时间就想到通过OCR的方式把验证码识别出来,其实OCR是有很高的错误率的,只有通过机器学习针对性训练才能提高这个准确度。

条条大道通罗马,因为用户名密码我们已经有了(网页上已经有值),我们可以尝试别的方法。

这里先科普一下网站跟B/S架构的系统登录的原理:是通过用户名密码登录成功后,由后台生成一个通行密钥返回给浏览器,浏览器在接下来的访问中都带上这个密钥给后台校验,这样就不需要用户每个操作都要输入一次用户名密码。

知道了这个原理我们就有思路了:能不能手工登录一次,然后找到这个密钥,通过Python爬虫代码发送到后台呢?

打开发者工具(F12),切换到Network(网络)标签页,然后回到网页上输入验证码,点击登录。这时候我们看到网页自动跳转到了一个数据页面,如果直接尝试把这个页面的URL放到Python爬虫代码里面执行,发现是访问不了的。

回到开发者工具,我们可以看到有个login的post请求,点击一下,在右边展开的详情页可以看到Status Code 的值是302,302是一个重定向代码。说明登录成功了,并让浏览器重定向到指定的网址。

登录就这一个请求,那后台返回的通行密钥也肯定在这里了。

还有一个小知识,就是浏览器的Cookie是浏览器自动发送的,无须通过代码的方式调用,也就是说大部分的网站通知密钥都会利用这个特性来进行。

既然是后台返回的,我们就找到Response Headers,内容不多,就7个键值对,可以看到跟Cookie有关的就一个Set-Cookie。

Set-Cookie:admin=1f708f67a4fa699e9ed9bfdecb98c9a4; Path=/; Domain=spiderbuf.cn; Max-Age=300

Set-Cookie是通知浏览器,把这个值保存到Cookie,Max-Age就是这个Cookie的有效期。

找有了这个值,我们就用Python编写爬虫代码验证一下。

# 使用Cookie就直接访问数据页面
url = 'https://spiderbuf.cn/playground/e02/list'

# 注意:要把Cookie改成自己的 
myheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36',
             'Cookie':'admin=1f708f67a4fa699e9ed9bfdecb98c9a4'}

html = requests.get(url, headers=myheaders, data=payload).text
print(html)

发现我们已经把想要的数据页面爬取下来了。

这个Cookie的值是一个简单的示例,建议大家发散一下思路,去了解一下Token、JWT等相关知识。

完整示例代码:示例代码