爬虫测试方案
策略种类:
无cookie,IP不变
加cookie,IP不变
无cookie,IP代理
记录信息:
被封时 :
测试机器
请求间隔
被封时间
被封前成功请求次数
被封现象
结论
有带IP代理时:
测试机器
请求间隔
测试时间
成功次数/请求次数
被封现象
搜狗
无cookie,IP不变
测试机器:我的电脑、Linux服务器(168)
请求间隔:1秒
被封时间:3分钟
被封前请求成功次数:118
被封现象:请求跳转进入输入验证码链接
http://www.sogou.com/antispider/?from=/web?query=庆余年&ie=utf8
手动访问链接输入验证码后,解封,解封后,请求119次(3分钟)再次被封。
结论:在无cookie时,封IP,输入验证码可解封。
加cookie,IP不变
测试机器:Linux服务器(168)
请求间隔:1秒
被封时间:3分钟
被封前请求成功次数:110
被封现象:请求跳转进入输入验证码链接
http://www.sogou.com/antispider/?from=/web?query=庆余年&ie=utf8
从windows的浏览器访问该链接,输入验证码后,拿到新的cookie(主要是新SNUID)后,更新到Linux机器的代码里,爬虫解封。
注:输入验证码前拿到的cookie里的SNUID不会改变。
结论:用有效cookie可以解封。
无cookie,IP代理
测试机器:Linux服务器(168)
请求间隔:1秒
测试时间:6分钟
成功次数/请求次数:59/124
被封现象:请求跳转进入输入验证码链接
http://www.sogou.com/antispider/?from=/web?query=庆余年&ie=utf8
加入IP代理后,可能会访问成功,也可能出现验证码跳转页面,也可能出现如下错误:
HTTPSConnectionPool(host=‘www.sogou.com’, port=443): Max retries exceeded with url: /web?query=%E6%88%98%E7%8B%BC&ie=utf8 (Caused by ProxyError(‘Cannot connect to proxy.’, OSError(‘Tunnel connection failed: 403 Forbidden’,)))
6分钟内请求124次,59次有数据返回。
结论:变换IP有效果,但是成功率百分之50,可能和IP质量有关系;
令,加了IP代理后,请求响应时间明显变慢。
搜狗防爬思路总结:
1、IP代理;
2、在被封时更新cookie(输入验证码后的),通过如下页面:
http://www.sogou.com/antispider/?from=/web?query=庆余年&ie=utf8
每输入一次验证码,可以拿到一个新的SNUID。
3、两种方法使用一种即可有效。
4、测试SNUID的时效性,如果够长可以提前构建SNUID池。
5、测试selenium获取cookie是否可以直接用。
破解实验
实验过程:
1、前一天晚上在一台IP可变(半小时变一次)的机器上部署了生成cookie的程序,并记录了cookie生成的时间,把生成的cookie放入redis的list;
2、今天中午11点,用前几天被封的cookie启动搜狗爬虫,发现又可以爬了,但是很快被封,当被封时从redis队列取出昨天放到redis里的cookie,发现马上解封,但是请求5次后又被封,再从redis取新的cookie,又可以继续爬,但是成功次数还是5次。
结论:
1、构造cookie池是个有效的方案,构造方法有两种,一是在改变IP的机器上自动生成cookie,二是通过访问搜狗验证码界面并输入验证码拿到新的cookie,链接如下:
http://www.sogou.com/antispider/?from=/web?query=庆余年&ie=utf8
2、每次换cookie后只能请求成功5次(间隔1s),而之前实验表明,不加cookie时只切IP也能解封,从而猜测搜狗也是cookie和IP同时监测,只不过没那么严格,至少切了cookie可以马上解封,所以可以继续尝试加上代理进行优化(延缓被封时间);
不过如果cookie池够大,即使5次被封,马上换cookie,也丝毫不影响效率;
3、被封的cookie过段时间可以解封,所以cookie池的cookie用完可以放队尾,并记录上次使用时间,便于通过下一次取cookie时判断和上次使用时间间隔来决定是否使用。
4、还需要考证一个cookie是否会过期,从而判断是否可以构建无限大cookie池,考证方法是,初步定一个间隔,比如取cookie时判断和上次使用时间间隔大于24小时才可以使用,如果遇到访问失败的cookie,加到失效cookie队列,再过一段时间,判断失效cookie队列的cookie是否还能使用,多次试验都不能使用,则说明cookie不是永久可以使用,反之亦然。
破解思路资料
https://www.jianshu.com/p/49422e2dd5a3
http://www.imooc.com/article/268611