最近我正写一个项目,项目的需求如下
一,要爬取大约100种几百个网页的类容,并且这些网页的爬取频率不一样,有些一天爬取一次,有些一周爬取一次,
二,网页爬取内容有变化,也就是说要爬取的内容会根据需求进行改变
鉴于以上需求,但我们就一定的做成分步式,在多台服务器上运行,用scrapy框架的话就会几百个spider ,如果要使用多台服务器的话,那怎么样才能保证各个服务的利用率呢,如果在不同的服务器上运行不同的spider,这种情况下如果不加以控制就可能会出现这种情况,一些服务器上的spider在全力运行,另一些服务器上的spider正空闲着,不能达到负载均衡,如果在做到负载均衡,把这些服务器做master-slave结构,如果把这几百个爬虫一起启动。用master对各个服务器进行分配任务,。做成主从结构之后主服务器对从服务器进行任务的分配,维护这个分配也是一件很容易出错的事情。
另一种方式是:将这几百个spider在不同的服务器上同时启动,同时监听。scrapy_redis默认是不自动关闭的。也就是说,如果从服务器上已经没有request。服务器仍是不会关闭的。他会持续的监听。这种情况就需要人为关闭,那这几百个爬虫的开启和关闭的维护就是一件很麻烦的事情。
我的解决办法是。把这些这几百个网页内容的爬虫,这几百个爬虫。放在一起做成一个综合的爬虫(主爬虫)。
如果这个项目只启动一个爬虫。对于那些不需要爬取的url只需要在我们的配置文件中进行配置就行,把不需要启动分爬虫注释掉,这样不需要启动的爬虫就不会激动。
这样做就解决了上述的问题,
第一,在这所有的服务器中,我们只启动了一个爬虫,那么这一个爬虫的开启或关闭的维护就变得很容易。
第二,就是说我只启动了一个爬虫。所有的服务器运行只运行一个爬虫,都到一个一个队列中去取数据这样所以的服务器就自动负载均衡。
第三,爬虫管理方便,如果对某个网页进行爬取,我们只需要对把要爬取的网页所对应的类注册到配置文件就行,把其他不需要爬取的类注释掉。这样主爬虫就会按照要求进行爬取。
第四,只有一个主spider到队列中取数据,这们队列的维护也变的简单
但是我们所使用的scrapy框架。默认是以单个爬虫作为单位的,也就是说。所有的爬虫就是一个class文件。他所有解析函数全是在这个class中,所以我们要更改scrapy的源码。把爬虫文件的解析类放在另外的包中,便于维护,这一步是最主要的工作,涉及到更改scrapy源码。
所爬取的网站主要分以下两种情况
第一、全站爬取,也就是说我给一个起始的URL,然后我再给这个爬虫的Rule规则,爬虫就会按照这样的规则,根据这个起始的URL进行全站爬取。
第二、不能进行全站爬取。只能通过给定的ID或者其他数据对构造URL,然后通过这些URL进行爬取。
其他功能:
一,定交Logger类,定义了之后在其他地方我们可以简单地调用就行。
二,我还定义了其他一些辅助方法。比如当爬虫队列中没有数据后过多久对爬虫进行关闭
三、当爬虫启动或者关闭或者出现异常时。都给我发邮件,这样对这个爬虫项目的监控就变的简单。
项目全解析很复杂,这里是项目地址。