一般爬虫要考虑的问题

之前尝试了request和cheerio实现的简单抓取数据用例,真的很初级,真正的爬虫且不说Google、百度等商用爬虫,即便是一个开源爬虫也要考虑很多东西,比如nodejs的开源爬虫​​neocrawler​​:

  1. 抓取网页并进行结构化解析,提取关键字后索引入库,防止网页重复抓取;
  2. 抓取利用JS产生内容的网页;
  3. 重试容错机制,失败后详细记录;
  4. 预设cookie,解决登陆后才能抓取内容问题;
  5. 限制并发数和集成代理IP功能,避免被原网站屏蔽;
  6. 分布式抓取提升效率。

网站反爬虫常用方法

  1. 通过识别爬虫的User-Agent信息来拒绝爬虫不过爬虫可以伪装User-Agent来躲避。
  2. 通过网站流量统计系统和日志分析来识别爬虫拿流量统计系统记录的IP和服务器程序日志记录的IP地址进行比较,如果服务器日志里面某个IP发起了大量的请求,在流量统计系统里面却根本找不到,或者即使找得到,可访问量却只有寥寥几个,那么无疑就是一个网络爬虫。
  3. 网站的实时反爬虫防火墙实现策略
    做一个访问计数器,记录每个IP的访问频度,在单位时间之内,如果访问频率超过一个阀值,我们就认为这个IP很可能有问题,那么我们就可以返回一个验证码页面,要求用户填写验证码。如果是爬虫的话,当然不可能填写验证码,所以就被拒掉了,这样很简单就解决了爬虫问题。注意可能要允许特定的User-Agent通过,要针对登录用户和非登录用户,针对有无referer地址采取不同的阀值和计数加速器等等。
    ​一个开源的插件​​可以继续改进:
    1、用网站流量统计系统来改进实时反爬虫系统
    网站流量统计系统记录的IP地址是真实用户访问IP,所以我们在网站流量统计系统里面也去操作memcached,但是这次不是增加计数值,而是减少计数值。在网站流量统计系统里面每接收到一个IP请求,就相应的cache.decrement(key)。所以对于真实用户的IP来说,它的计数值总是加1然后就减1,不可能很高。这样我们就可以大大降低判断爬虫的阀值,可以更加快速准确的识别和拒绝掉爬虫。
    2、用时间窗口来改进实时反爬虫系统
    爬虫爬取网页的频率都是比较固定的,不像人去访问网页,中间的间隔时间比较无规则,所以我们可以给每个IP地址建立一个时间窗口,记录IP地址最近12次访问时间,每记录一次就滑动一次窗口,比较最近访问时间和当前时间,如果间隔时间很长判断不是爬虫,清除时间窗口,如果间隔不长,就回溯计算指定时间段的访问频率,如果访问频率超过阀值,就转向验证码页面让用户填写验证码。
    不过有些爬虫可能相当狡猾,它也许会通过大量的爬虫测试来试探出来你的访问阀值,以低于阀值的爬取速度抓取你的网页,因此我们还需要辅助第3种办法,用日志来做后期的分析和识别,就算爬虫爬的再慢,它累计一天的爬取量也会超过你的阀值被你日志分析程序识别出来。
    总之我们综合运用上面的四种反爬虫策略,可以很大程度上缓解爬虫对网站造成的负面影响,保证网站的正常访问。