爬虫训练营-反爬虫之cookie

此文已在本人个人微信公众号(iwoods100,不会下厨的健身爱好者不是一个好程序员)首发,关注可查阅全部文章。


前面讲过,cookie存储在浏览器端,常用来保存“认证数据”,请求会携带这些数据发送给服务器,这样服务器才能判断当前请求的状态,比如是否自动登录?


状态不同,服务器返回的数据也会不一样。比如未登录状态会先返回一个登录界面,而登录状态则直接返回已登录界面。


除了自动登录外,cookie还会存放其它状态数据,这取决于网站业务。


有些网站还会设置一些cookie验证,如果你的请求不包含它们,则拒绝访问。


所以,在爬虫模拟请求时,应该先理顺哪些cookie是必须的,哪些是不必的。


爬虫训练营-反爬虫之cookie_第1张图片


分析cookie


为了判断一个网站是否会检测cookie,可以做一些简单的测试。


一般来说,涉及到查询业务的数据,验证cookie的可能性会大一些,但实际上大部分都不会检验cookie。


比如我访问淘宝电影网,就必须要带上淘宝的cookie。


如果不带会怎么样?虽然前几次能正常访问,但在访问数十次后,你会发现返回的不是请求数据,而是一个验证码页面,此时淘宝就已经对你的ip封锁了,而解决方法也很简单,先输入正确验证码解锁,然后学乖一点,每次发送请求的时候记得带上cookie。


如果你使用的是linux后台,建议安装一个界面(如VNC)和浏览器,方便给ip解锁。


当然你也可以让程序自动解锁,如果你看了本专题下的验证码部分和session部分,就能做到,只是实施起来挺麻烦。


接下来带大家调试一下南航航班请求会不会检验cookie呢?为了方便,我使用Fiddler来调试。


完整的http请求就像下图这样~


爬虫训练营-反爬虫之cookie_第2张图片


红框中是会发送给服务器的cookie。


你可以把红框中的cookie删除,然后再次请求,就像下面这样:


爬虫训练营-反爬虫之cookie_第3张图片


通过判断两次请求返回的数据是否一致,就能判断服务器是否对cookie有验证。


在这里,返回的数据正好是一致的,说明南航官网对航班数据的查询并没有cookie验证。


模拟cookie


通过Fiddler可以很方便的发送请求,那如何在python中实现带cookie的请求呢?


以下是我常用的模拟方式:


爬虫训练营-反爬虫之cookie_第4张图片

通过上面的接口创建cookie后,就可添加在请求中了。


爬虫训练营-反爬虫之cookie_第5张图片


有时候你需要动态获取cookie,也就是从返回的数据中找到服务器最新设置的cookie,提取出来即可。(一般针对SESSIONID才会这样做)


TIPS


不知你是否注意到,我在创建cookie的时候使用的是cookielib.Cookie构造函数。为什么要这样做呢?因为能够灵活设置cookie的相关属性。而我也建议你这样做。


尤其要注意cookie的域名属性,因为有的请求下的cookie包含了多种域名cookie,比如淘宝网的cookie列表:


爬虫训练营-反爬虫之cookie_第6张图片


其次,有效期也很重要,请给cookie设置一个永不过期的有效期。



不会下厨的健身爱好者

不是一个好程序员


爬虫训练营-反爬虫之cookie_第7张图片

长按二维码关注

你可能感兴趣的:(爬虫训练营-反爬虫之cookie)