第一部分:基础概念
到次为止,我们介绍过大部分表单都允许你想网站提交信息,或者让你在提交表单后立即看到想要的页面信息,那么,这些表单和登录表单(当你浏览网站时让你保持“已登录”状态)有什么不同?
大多数新式的网站都用cookie跟踪用户是否已登录的状态信息。一旦网站验证了你的登录权证,它就会将它们保存在你的浏览器的cookie中,里面通常包含一些服务器生成的令牌、登录有效时限和状态跟踪信息。网站会把这个cookie当做信息验证的证据,在你浏览网站的每个页面时出示给服务器。在20世纪90年代中期广泛使用cookie之前,保证用户安全验证并跟踪用户是网站上的一大问题。
虽然cookie为网络开发者解决了大问题,但同时却为网络爬虫带来了重大问题。你可以一整天只提交一次登录表单,但是如果你没有一直关注表单传回给你的那个cookie,那么一段时间以后再次访问新页面时,你的登录状态就会丢失,需要重新登录。
第二部分:实战
2.1 登录测试:
在http://pythonscraping.com/pages/cookies/login.html有一个简单的登录表单(用户名可以是任意值,但是密码必须是“password”) 。这个表单在 http://pythonscraping.com/pages/cookies/welcome.php处理,里面包含一个简介页面http://pythonscraping.com/pages/cookies/profile.php。
如果你在登录会签想要进入欢迎界面或简介界面,会看到一个错误信息和访问前请先登录的指令。在界面页面中,网站会检测浏览器的cookie,看它有没有页面已经登录的设置信息:
用Requests库跟踪cookie同样很简单:
import requests
params={'username':'Peter','password':'password'}
r=requests.post("http://pythonscraping.com/pages/cookies/welcome.php",params)
print("Cookie is set to:")
print(r.cookies.get_dict())
print("....a......")
print("Going to profile page ...")
r=requests.get("http://pythonscraping.com/pages/cookies/profile.php",cookies=r.cookies)
print(r.text)
与浏览器执行结果一致。
2.2 复杂网站处理方式
对于简单的网站,一般上面的方法就可以使用了,但是如果你面对的是一个比较复杂的网站,它经常暗自调整cookie,或者如果你从一开始就完全不想要用cookie,该怎么处理呢?Requests库的session函数可以完美地解决这些问题:
import requests
session=requests.Session()
params={'username':'Peter','password':'password'}
s=session.post('http://pythonscraping.com/pages/cookies/welcome.php',params)
print("Cookie is set to:")
print(s.cookies.get_dict())
print("..........")
print("Going to porfile page...")
s=session.get("http://pythonscraping.com/pages/cookies/profile.php")
print(s.text)
第三部分:小结
Requests库是一个非常给力的库,程序员完全不用费脑子,也不用写代码,可能只逊色与Selenium.虽然写网络爬虫的时候,你可能想放手让Requests库替自己做事情,但是持续关注cookie的状态,掌握它们可以控制的范围是非常重要的,这样可以避免痛苦地调试和追寻网站异常行为,节省很多时间。