5.1 使用 Cookies 登录网站
5.1.1 网站的保持登录机制
爬虫实战-模拟登录和验证码的处理
有时候要爬取的内容必须登录才能看到,这时就要求爬虫能够登录网站,并保持登录状态。另外,爬虫在登录网站的时候,还有可能遇到需要填写验证码的情形。这一章将通过模拟登录豆瓣网站为读者讲解登录网站的两种方式,并对登录过程中遇到验证码的问题进行简单分析。
我们平时在浏览网站的过程中会发现,如果登录了一个网站,如豆瓣,打开新的豆瓣网页会发现还是处于登录的状态。那么,网站是如何保持这种登录状态的呢?爬虫能否利用网站保持登录的机制,实现对网站深层网页的爬取呢?这就是本节要重点讲解的内容。
一般来讲,网站常用的保持登录机制有如下两种。
1. Cookies 机制
Cookies 是浏览器访问一些网站后,这些网站存放在客户端的一组数据,用于网站跟踪用户,实现用户自定义功能。
一般使用 Cookies 保持用户登录的过程是这样的:用户登录验证后,网站会创建登录凭证(如用户 ID+登录时间+过期时间),对登录凭证进行加密,将加密后的信息写到浏览器的 Cookies 中,以后每次浏览器请求都发送 Cookies 给服务器,服务器根据对应的解密算法对其进行验证。
2. Session 机制
Session 是存放在服务器端的类似于 HashTable 的结构,用来存放用户数据。当浏览器第一次发送请求时,服务器自动生成了一个 HashTable 和一个 Session ID 用来唯一标识这个 HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求时,系统会将前一次服务器响应中的 Session ID 放在请求中,一并发送到服务器上,服务器从请求中提取出 Session ID,并和保存的所有 Session ID 进行对比,找到这个用户对应的 HashTable。一般来说,Session ID 在用户端使用 Cookies 来保存。
上面两种网站保持登录的机制都用到 Cookies,读者很容易想到,爬虫应该也可以通过 Cookies 保持登录状态这个特性,以实现登录爬取。在发起请求的时候,如果给爬虫添加一个已经登录的 Cookies,就可以让爬虫使用 Cookies 直接登录网站,从而访问网站的深层页面。
5.1.2 登录豆瓣网站
要使用 Cookies 登录一个网站,首先需要获得一个已经登录的 Cookies,我们可以在浏览器中登录,然后把浏览器保持登录的 Cookies 复制下来,在发起请求的时候带上复制下来的 Cookies,这样就可以实现爬虫登录网站。
首先打开豆瓣的首页,输入用户名和密码并单击“登录豆瓣”。在登录后的网站空白处单击右键,在弹出的菜单中选择“检查”,然后在下方(或右侧)弹出的检查页面顶部菜单中选择 Network,如图 5-1 所示。
图 5-1 在已登录的豆瓣首页使用 Chrome 检查工具
可以看到,检查页面中的 Network 的内容是空的,现在刷新页面,会发现检查页面中 Network 内容增加了很多访问的链接,把右边滚动条拉到最上面,就可以看到请求的第一个网址为 www.douban.com,单击它,右侧会出现这个请求的详细情况,里面就有这次请求所发出的 headers 信息和 Cookies 信息,如图 5-2 所示。
图 5-2 查看请求的头部信息
可以看到访问豆瓣网站浏览器所使用的 Cookies,是一个保存了登录信息的 Cookies。它可以帮助爬虫实现对豆瓣网站的登录。
直接从浏览器中把这个 Cookies 复制下来,以一个长字符串的形式赋值给变量 cookie。
>>>cookie = '__yadk_uid=kswGfi49r8rHHyFvv20LUAjsQ2pwnOOz; bid=6Cmr_XEQdSY; ll="108288"; __utmt=1; dbcl2="165023527:QaLM24L2LmA"; ck=3U-T; _pk_id.100001.8cb4=8585dc281f4a81f8.1515422106.1. 1515422134.1515422106.; _pk_ses.100001.8cb4=*; push_noty_num=0; push_doumail_num=0; __utma=30149280.460062778.1515422126.1515422126. 1515422126.1; __utmb=30149280.3.10.1515422126; __utmc=30149280; __utmz=30149280.1515422126.1.1.utmcsr=(direct)|u tmccn=(direct)|utmcmd=(none); __utmv=30149280.16502'
下面编写一个函数,把这个字符串形式的 Cookies 处理成字典的形式。
>>>def coo_regular(cookie): coo = {} for k_v in cookie.split(';'): k,v = k_v.split('=', 1) coo[k.strip()]=v.replace('"', '') return coo >>>cookies = coo_regular(cookie)
把从浏览器中复制出的 Cookies 传到 coo_regular 函数,就得到了字典形式的保持登录状态的 Cookies,现在使用这个 Cookies 访问豆瓣的首页,然后验证是否已经登录。
>>>headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) \ AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/46.0.2490.80 Safari/537.36'} >>>r = requests.get('https://www.douban.com', headers=headers, cookies=cookies) >>>print('日月光华' in r.text) #验证源码中是否包含个人昵称 True
显示的结果验证打开的是已经登录的个人主页,说明已经成功地使用 Cookies 登录了豆瓣网站。这样就表明,可以使用这个 Cookies 登录豆瓣网站并访问一些深层网页。
在实际的应用过程中,因为 Cookies 是有一定时效的,它有可能过一段时间会失效,所以要编写代码检测 Cookies 是否过期。如果 Cookies 已经无法登录,既可以手动重新获取登录后的 Cookies,也可以使用在第 7 章将要讲到的 Selenium 打开浏览器登录并获取登录后的 Cookies,然后继续爬取深层网页。
以上简单介绍了网站的保持登录机制,然后利用这种机制使用 Cookies 登录了豆瓣网站。使用 Cookies 登录网站相对简单、易用,但也有缺点,那就是必须获取到已经登录的 Cookies。下一节将讲解如何让 Requests 发送表单数据以自动登录网站,并在抓取过程中保持登录状态。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论