最近写一个爬虫系统时候,遇到采集几百条数据后,ip就被对方给屏蔽了,下面就这个问题总结一下解决方法:
目录
1、测试安全间隔
测试的目的就是得到网站允许的最大访问频率是多少,确定一个合理的访问时间间隔。方法是:先使用一个较大的间隔(例如30秒)去访问网站(可以自己写程序实现,也可以借助类似iMacros的浏览器自动化插件),如果不会被屏蔽就减少间隔时间,重复上述步骤直到IP被屏蔽。假设间隔3秒正常,间隔2秒时被屏蔽了,我们就能大概估计出网站允许的最大访问频率限制为“1次/3秒”。
2、制定控制策略。
如果我们使用“1次/大于3秒”的频率去访问网站就是安全的(当然这个频率越小越安全),根据我们的经验,大多网站使用“大于3秒”的时间间隔访问是不会触发网站的屏蔽策略(我们的建议间隔值:5秒)。
在程序中的实现方法:对于同一个IP,在下载页面之前判断与上次访问间隔的时间是否超过5秒了,如果没有就sleep,直到超过5秒才能发出下一个请求。
3、用多线程+HTTP代理提速
如果我们采用5秒的时间间隔意味着每分钟我们只能完成12次的访问(HTTP请求),一天也仅仅能完成不到2万次的下载(3600 * 24 / 5 = 17280)。这个速度对于小规模的网站还能接受,但对于拥有上百万甚至千万页面的网站来说,这个速度实在是太慢了。以大众点评网为例,1500万页,照这个速度需要2年零4个月才能完成,太可怕了。
而我们采集一次大众点评网仅需要15天左右,我们是怎么做到的呢? 就是通过多线程+ HTTP代理。用过HTTP代理的虫师都知道当我们通过高匿名HTTP代理发出一个请求,目标网站只能检测到HTTP代理的IP,而无法检测到源IP,也无法知道你在使用代理,对目标网站来说这个请求是来自于另外一个访客(与你无关)。假设我们拥有100个稳定高匿的HTTP代理,仍然在同IP间隔5秒的前提下,理论上每天能达到的下载量是170万!
在程序中的实现方法:开启100个线程,每个线程固定地使用一个HTTP代理,每个线程处理不同的采集任务,每个线程内控制访问网站的速度。由于数据提取是纯计算操作多线程并不能加速,12核CPU环境下,实际每天的采集量能达到100万左右(每个页面提取20个字段左右)。