此文已在本人个人微信公众号(iwoods100,不会下厨的健身爱好者不是一个好程序员)首发,关注可查阅全部文章。
前面讲过,cookie存储在浏览器端,常用来保存“认证数据”,请求会携带这些数据发送给服务器,这样服务器才能判断当前请求的状态,比如是否自动登录?
状态不同,服务器返回的数据也会不一样。比如未登录状态会先返回一个登录界面,而登录状态则直接返回已登录界面。
除了自动登录外,cookie还会存放其它状态数据,这取决于网站业务。
有些网站还会设置一些cookie验证,如果你的请求不包含它们,则拒绝访问。
所以,在爬虫模拟请求时,应该先理顺哪些cookie是必须的,哪些是不必的。
分析cookie
为了判断一个网站是否会检测cookie,可以做一些简单的测试。
一般来说,涉及到查询业务的数据,验证cookie的可能性会大一些,但实际上大部分都不会检验cookie。
比如我访问淘宝电影网,就必须要带上淘宝的cookie。
如果不带会怎么样?虽然前几次能正常访问,但在访问数十次后,你会发现返回的不是请求数据,而是一个验证码页面,此时淘宝就已经对你的ip封锁了,而解决方法也很简单,先输入正确验证码解锁,然后学乖一点,每次发送请求的时候记得带上cookie。
如果你使用的是linux后台,建议安装一个界面(如VNC)和浏览器,方便给ip解锁。
当然你也可以让程序自动解锁,如果你看了本专题下的验证码部分和session部分,就能做到,只是实施起来挺麻烦。
接下来带大家调试一下南航航班请求会不会检验cookie呢?为了方便,我使用Fiddler来调试。
完整的http请求就像下图这样~
红框中是会发送给服务器的cookie。
你可以把红框中的cookie删除,然后再次请求,就像下面这样:
通过判断两次请求返回的数据是否一致,就能判断服务器是否对cookie有验证。
在这里,返回的数据正好是一致的,说明南航官网对航班数据的查询并没有cookie验证。
模拟cookie
通过Fiddler可以很方便的发送请求,那如何在python中实现带cookie的请求呢?
以下是我常用的模拟方式:
通过上面的接口创建cookie后,就可添加在请求中了。
有时候你需要动态获取cookie,也就是从返回的数据中找到服务器最新设置的cookie,提取出来即可。(一般针对SESSIONID才会这样做)
TIPS
不知你是否注意到,我在创建cookie的时候使用的是cookielib.Cookie构造函数。为什么要这样做呢?因为能够灵活设置cookie的相关属性。而我也建议你这样做。
尤其要注意cookie的域名属性,因为有的请求下的cookie包含了多种域名cookie,比如淘宝网的cookie列表:
其次,有效期也很重要,请给cookie设置一个永不过期的有效期。
不会下厨的健身爱好者
不是一个好程序员
长按二维码关注