经过前面的介绍,我们大致了解了站点压力控制对于爬虫的重要性。但是站点压力控制对于爬虫来说,是一个比较Open的话题。即到目前为止也没有一个很准确的压力控制方法。

主要的问题由于以下几点:

  1. 不同站点对于爬虫的压力允许程度不同。 即由于站点的规模不同、站点的服务器配置不同等。不同的站点能承受的压力是不同的。同时不同的站点对于爬虫的友好程度不同。有些站点允许爬虫爬去其数据,而有些站点不希望爬虫爬取其数据。对于爬虫的压力允许也就不同。
  2. 站点对于不同爬虫的压力允许程度不同。 网络中的爬虫有很多,有大的搜索引擎公司的爬虫,比如google的Googlebot,百度的baiduspider,搜狗的sogou spider,有道的YodaoBot,腾讯的Sosospider,msn的是Msnbot。还有一些个人开发的用来尝试的小的爬虫。因此即使同一站点,对于网络中的不同爬虫的压力允许程度不同的。因为站点让爬虫爬取数据是希望能让搜索引擎搜录其数据,从而可以给用户检索,一遍用户通过搜索引擎访问到自己站点的数据。即给自己带来流量。因此会考虑给自己来来流量的大小而对不同的爬虫允许的程度不同。目前国内百度是第一大的搜索引擎公司。其爬虫的技术比较成熟。同时各大网站对其爬虫的压力允许程度也相对要宽松一些。即允许其爬虫更多的技术。(也有主动向其推送数据的)。每个爬虫都需要考虑站点对于自己能允许的压力。
  3. 站点对于爬虫的压力允许程度不是公开的。 由于网络上的爬虫,站点不可能一一告诉各个爬虫其允许的压力程度。同时站点也大致都没有告诉爬虫其压力程度。站点都是在自己的服务器管理上添加爬虫访问的限制工具。当爬虫压力过大时直接封禁爬虫处理。

但是即便对于爬虫来说进行压力控制是一个困难的问题,但是对于一个正规的爬虫来说,如果想爬虫站点的数据,就不得不面对这个问题。

而站点的压力控制可以分为以下几点:

  1. 压力的形式:通常来说,压力主要分为两个部分:抓取间隔和并发度。抓取间隔是两次抓取时间的时间窗口。而并发度,则是同一时刻有几个线程或者进程在访问站点。比如抓取间隔为10s,并发度为1,就是每隔10s访问站点的1个链接。这两个参数决定了爬虫对站点的抓取压力。而且这两个参数的不同造成的压力是不相同的。比如说抓取间隔为10,并发度为10,是每隔10s访问站点的10个链接, 其在100s内访问的链接为100/10*10= 100个链接。而抓取间隔为100,并发为100,其在100s内访问的链接为100/100*100= 100个链接。虽然两个在100s。看起来访问的站点链接数量是相同的,但是对站点的压力来说是不同的。因为间隔为100,并发为100的这种压力,虽然间隔相对较长,但是在一个瞬时100的压力对站点来说可能会较大的。
  2. 对站点来说,一段时间访问总量过大会造成压力过大,而在同一时刻并发数较多,也是会造成压力过大的问题的。
  3. 压力的粒度:爬虫面对的是一个一个的站点,而实际上,爬虫抓取是经过dns解析成站点的ip,而站点和ip之间的关系是一种多对多的关系。即一个站点可能对外有多个ip,而一个ip上也可能有多个站点(通常是一些托管小站,托管在一个站点上)。 压力控制以站点为单位的话,逻辑上要简单。但是对于一个ip上多个站点可能会造成压力大的问题。而以ip为单位,则需要考虑一个ip上多个站点的轮转问题。同时一个站点多个ip时,还需要考虑多个ip上的压力分摊问题。 也可以采取<站点,ip>的二元组的粒度来控制压力。机制上相对复杂一些,但是可以更好的控制压力。
  4. 压力的计算:压力计算是压力控制的核心。其中有复杂的策略。后面单独介绍该问题。
  5. 压力的执行:理论的压力计算的再好,也需要按照计算的压力执行,才能达到预期的效果。这就要考虑抓取缓存的设置问题,缓存是有效的,因此不能无限制的将数据发给缓存。而缓存的数据如果不足,则会导致压力执行的中断,导致这段时间配额的浪费。

压力计算的策略

    压力计算主要考虑的因素:

  1. 站点规模:一般来讲,站点规模较大,站点的用户访问频度较多,站点的压力承受程度相对要大些。其可以作为一个参考因素。
  2. 站点质量:站点质量指站点的数据是否是特别需要的,即质量较高,并且可代替性较低。站点质量较高的站点,代表爬虫对其的抓取需求高。需要的抓取压力控制程度高。
  3. 站点成分:站点的成分一般指站点的索引页的比例。如果索引页较多,承担着其他站点提供索引的功能,则其可以帮助我们发现链接。应该为其提供相对多一些的抓取。
  4. 站点待抓比:站点的待抓取比高,表明站点的抓取需求大,希望抓取的数据更多一些。但是,计算站点待抓比时需要考虑历史因素,即由于历史因素的造成的待抓比高,不能觊觎短期内可以弥补而将压力调节的较大。
  5. 站点访问时间: 一般来讲,站点的访问时间较大时,代表站点的服务器压力较大。此时应该降低抓取压力,以造成对方服务器的崩溃或者对方的封禁。
  6. 站点的约定: 站点主动提供抓取压力说明时,应该控制抓取压力不超过对方设置的压力限制。
  7. 站点抓取结果: 如果站点的抓取成功比率降低时,一般表示站点的压力可能较大。此时应该注意降低站点压力,以避免无效的抓取和站点的封禁。而且这时的抓取可能会带来我们死链判断的误判。如果站点已经明确封禁或者发现站点封禁的话,则应该降低至很低的抓取压力,使用少量的几个url来测试站点是否解除封禁。

   抓取压力需考虑的其他问题

     上面是我们进行压力计算的时候需要考虑的问题,但是实际的问题是复杂的。比如站点规模较大只是代表了站点能承受的压力较大,但是站点如果对于爬虫不够友好的,则可能允许爬虫的压力较小。在设定了抓取压力时,我们也需要对我们的抓取情况进行监控统计,来观察按照我们计算的压力执行时,是否合理。另外,在具体环节中的情况多种多样。比如有些站点对于不同时段对于爬虫的压力允许程度是不同的。比如站点在早上八点到十点和下午两点到五点这种工作时间会有较多的用户访问,希望爬虫能避开这样的用户访问高峰来访问,对于时效性允许的网站我们应该考虑该问题。同时还有新闻这种时效性站点,可能在编辑的上班时间发布的新闻较多,这时候需要相对较大的抓取压力。而在晚上的时段则可能产生的新闻较多,我们对于新闻HUB也的抓取频度可以适当降低。

  

  

   

 

 

refer:http://www.antcome.com/site/seospider.html