在网络爬虫抓取信息的过程中,如果抓取频率高过了网站设置的阀值,会被禁止访问。通常,网站的反爬虫机制依据IP来标识爬虫。
开发者可以采取以下手段来解决这个问题:
1、放慢抓取速度,减小对于目标网站造成的压力。这样会减少单位时间类的抓取量。
2、通过设置代理IP等手段,突破反爬虫机制继续高频率抓取。但是这样需要大量稳定的代理IP。
3、通过ADSL交替拨号,诈骗运营商IP
(https://www.zhihu.com/question/26018679)。
之前有一段爬虫研发的经验,当时要爬取上百个竞品网站,有些网站每天需要爬取的数据量以百万计,必须要有一套既高效又不(经常)被封IP的方案。我当时采用通过策略,设置代理IP的手段。
基本思路是将得到的代理IP用于爬取数据,抛弃不能爬取数据的IP,提高爬取速度快的IP的使用率,控制IP的使用率防止被屏蔽,在这三个策略的作用下,让代理IP资源在代理IP池中持续更新。整个结构如下图所示(这个模块起名叫“代理IP管理模块”)。
一、代理IP获取
贩卖中了木马的服务器IP已经形成一条地下产业链,在淘宝或者一些QQ群中能够找到提供这种代理IP的商家(他们通过扫描IP段的特定端口发现这些中了木马的服务器(肉鸡))。一般100多元就能包月(使用成本非常的低),几乎可以无限次从商家(API接口)那里获得实时更新的代理IP。但是这些IP质量参差不齐,有的能用,有的不能用,有的速度慢,有的只有某些时段能使用。
将这些IP用于爬取百度首页进行初步筛选,能用的留下,放入代理IP池队尾(参看二、代理IP池章节)。
二、代理IP池
1、为每一个需要被爬取的网站设置一个独立的代理IP池,同一个IP爬不同的网站表现(有的能爬,有的不能爬,有的快,有的慢)不同。
2、一个IP池结构如下图,环形队列。借代理时从对头将代理IP数据取出,提供给抓取节点爬取网站数据。
3、如果这个代理IP能够爬取该网站数据,爬取成功后,抓取节点归还此代理IP(报告代理IP抓取成功)。程序将这个代理IP写入环形队列队尾。
三、借代理
接待里功能有一个限速功能,同一个代理IP,借出的频率需要控制,否则有可能被网站屏蔽。限速的方法可参看guava的RateLimiter工具。如果从代理IP池拿到的代理IP超过频率上线了,丢弃这个IP,再从代理IP池中获取下一个IP。知道拿到满足限速要求的IP。(丢弃IP不会导致可用代理IP大量减少,因为“代理IP获取功能” 和“代理再投放” 功能会不断的往代理IP池里补充可用代理IP)。
四、还代理
抓取节点使用代理IP爬取网页会有一下结果,成功、超时、连接失败、被屏蔽。抓取节点会将结果反馈给“代理IP管理模块”。对于成功抓取网页的代理IP,直接放入“代理IP池”;对于超时或连接失败的IP,抛弃处理;对于抓取耗时很少的IP(优质IP),放入“代理再投放模块”;对于被屏蔽的,通知“借代理”功能调低借出频率。
五、代理再投放
对于优质代理IP,需要防止因为某次抓取失败就丢失的风险,同时需要适当提高它用于爬取数据的频次。“代理再投放”功能,会在一段时间延迟之后,将这个优质IP再次放入“代理IP池”,投放次数随时间衰减。这样“代理IP池”中就会出现两个相同IP(IP1),IP1用于爬取的频次就变多了。由于IP1爬取成功率高,它会被不断的再投放,占据IP池更多的空间。当然“借代理”功能由限速,IP1不会占满“代理IP池”。
在这几个策略的共同作用下,“代理IP池”中的IP会保持动态平衡,既不被网站屏蔽,又有很高的效率。
上图是某个IP对网站爬取量的时间图。线条1,IP借取次数;线条2,抓取成功量;线条3,IP再投放次数;线条4,被屏蔽次数。
蓝线表示借代理的量,红线表示用这个代理能够正常完成下载的量,我们能看到蓝线、红线大多数时间保持一致,表明下载成功率较高。
图中上午11点左右,成功率有所下降,此时抓取模块既报告IP可用,也大量报告IP不可用(借的量多,还的量少)。 此时候“代理在投放”功能马上进行干预,将该IP重新放入“代理IP池”,避免该IP因短时间不好用导致被淘汰。
整个抓取过程中,被屏蔽的情况很少。
OK,一个月200块钱的代理IP费,搞定单网站每天百万量级数据爬取需求。