最近我正写一个项目,项目的需求如下
一,要爬取大约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类,定义了之后在其他地方我们可以简单地调用就行。
二,我还定义了其他一些辅助方法。比如当爬虫队列中没有数据后过多久对爬虫进行关闭
三、当爬虫启动或者关闭或者出现异常时。都给我发邮件,这样对这个爬虫项目的监控就变的简单。

项目全解析很复杂,这里是项目地址

通过更改scrapy源码进行spider分发实现一个综合爬虫的更多相关文章

  1. Scrapy源码学习(一)

    用Scrapy已经有一段时间了,觉得该是看一下源码的时候了.最开始用的时候还是0.16的版本,现在稳定版已经到了0.18.结合使用Scrapy的过程,先从Scrapy的命令行看起. 一.准备 下载源代 ...

  2. scrapy源码分析(转)

    记录一下两个讲解scrapy源码的博客: 1.http://kaito-kidd.com/2016/11/21/scrapy-code-analyze-component-initialization ...

  3. 2018-01-28-TF源码做版本兼容的一个粗暴方法

    layout: post title: 2018-01-28-TF源码做版本兼容的一个粗暴方法 key: 20180128 tags: IT AI TF modify_date: 2018-01-28 ...

  4. memcached源码分析-----item过期失效处理以及LRU爬虫

    memcached源码分析-----item过期失效处理以及LRU爬虫,memcached-----item 转载请注明出处:http://blog.csdn.net/luotuo44/article ...

  5. Twisted使用和scrapy源码剖析

    1.Twisted是用Python实现的基于事件驱动的网络引擎框架. 事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定.它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的 ...

  6. Scrapy源码注解--CookiesMiddleware

    class CookiesMiddleware(object): """ 中间件在Scrapy启动时实例化.其中jars属性是一个默认值为CookieJar对象的dict ...

  7. highchart导出功能的介绍更改exporting源码

    本案利用highchar作为前端,展示数据的图形效果,结合spring+springmvc来完成数据图片的导出. jsp引入文件: <script src="${pageContext ...

  8. 更改ligerui源码实现分页样式修改

    修改后样式: 第一步:实现功能. 更改源码部分ligerui.all.js文件 读源代码,发现ligerui底部工具条是这样实现的(ps:注释部分为源码) _render: function () { ...

  9. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

随机推荐

  1. bzoj 2005: [Noi2010]能量采集【莫比乌斯反演】

    注意到k=gcd(x,y)-1,所以答案是 \[ 2*(\sum_{i=1}^{n}\sum_{i=1}^{m}gcd(i,j))-n*m \] 去掉前面的乘和后面的减,用莫比乌斯反演来推,设n< ...

  2. 洛谷 P3356 火星探险问题 【最大费用最大流】

    输出方案好麻烦啊 拆点,石头的连(i,i',1,1)(i,i',inf,0)表示可以取一次价值1,空地直接连(i,i',inf,0),对于能走到的两个格子(不包括障碍),连接(i',j,inf,0), ...

  3. pip 的具体含义

    Python 2.7.9 and later (on the python2 series), and Python 3.4 and later include pip (pip3 for Pytho ...

  4. strings命令的实现 2014-06-02 00:17 355人阅读 评论(0) 收藏

    本程序实现从文件中提取连续4个以上的可打印字符.模仿linux中string命令 #include <stdio.h> #include<stdlib.h> #include ...

  5. java单元测试注释执行顺序

    JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @BeforeClass 全局只会执行一次,而且是第一个运行 @Before 在测试方法运行之前运行 @Test 测试方法 @Afte ...

  6. 为什么JAVA虚拟机分为线程共享和非线程共享?

    大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟 ...

  7. dockerfile构建的镜像

    转载请注明出处 https://www.cnblogs.com/majianming/p/9536975.html 在每执行一个命令时,便会commit形成一个层,最后形成堆栈式的结构.最后的镜像是各 ...

  8. js类、原型——学习笔记

    js 内置有很多类,我们用的,都是从这些类实例化出来的. function Object () {} function Array () {} function String () {} functi ...

  9. linux下svn安装(ALI ECS)

    yum安装svn 搭建和使用SVN 可参考阿里云文档:https://help.aliyun.com/document_detail/52864.html?spm=5176.8208715.110.1 ...

  10. 如何参与一个GitHub开源项目?

    如何参与一个GitHub开源项目? 摘要:本文是Github官如何参与一个GitHub开源项目方给出的参与Github上开源项目的一些指导,对希望加入开源社区的开发者是一个不错的参考. 最近一年开源项 ...