Cookie,引用百度百科的定义“是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息”。网站就是判断一个请求里带的cookie是否有效,来判断客户请求是否已登录过,来避免每次访问一个新的网页,都要求重新登录(这样就反人类了)。
如上图所示,客户端的cookie是网站验证你的登录请求成功后,在应答的Set-Cookie域里面设置,客户端收到后会记录在本地,并在后续的请求中带上。
所以,要实现模拟登录抓取数据,有两个思路。一是我们的程序就要模拟上面流程图的第3步和第4步,获取一个有效的cookie。二是先通过浏览器登录网址获取到cookie,再复制到我们的抓取脚本中。这两个方式各有优劣,第一种办法很简单就不解释了,下面我们来看下第二种办法。
这是最正统的方法,脚本完成后可以自动化运行,也不用担心cookie过期等问题。但是就是技术门槛比较高,特别是带验证码(特别是一些复杂验证码,如滑动拼图,选择图片等)的登录,非常难以实现。还有的在客户端发包时就会对密码进行加密(不依赖https),这样就成为更难逾越的鸿沟。
我们以pjob为例(因为它比较简单),来介绍下scrapy框架如何实现登录。
首先是尝试登录pjon,利用F12开发者工具查看请求送的字段。
下面我们开始编码,编码思路就是首先访问pjob登录界面,再模拟发送登录验证POST请求,登录成功后,再访问账户个人订单界面(带上登录返回的cookie信息),验证cookie有效性。Scrapy项目的生成以及常规前置工作在前面几篇文章已详细说明,这里不再赘述
如上图所示,我们使用了FormRequest构造了一个POST请求,请求字段就是我们在浏览器看到的。这里注意要定义一个特殊的meta元素cookiejar,meta是用于在请求应答中传递数据的字典,针对cookiejar这个特色键,scrapy会自动赋登录返回的cookie值,现在的初始值无所谓,我们填0
如上图所示,登录后我们用一个GET请求访问个人订单页,这里就用上了meta里的cookiejar的值,在新的请求包里带上了应答的cookie。Scrapy运行输出如下:
抓取回来了我的个人数据。