【爬虫-反爬虫】系列一:反爬虫之cookie(3)

反爬虫之cookie

前面讲过,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设置一个永不过期的有效期。