最近我正写一个项目,项目的需求如下
一,要爬取大约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. 计蒜课--2n皇后、n皇后的解法(一般操作hhh)

    给定一个 n*nn∗n 的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入 nn 个黑皇后和 nn个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条斜线(包括正负斜线)上,任意的两个白皇后都 ...

  2. 创建Mesh->格子地图转NavMesh->可破坏墙壁

    1. 前言     最近连续做了很多代码动态生成Mesh的工作,从动态生成修改瞄准范围的Mesh到可破坏的墙壁,以及之前写了一半导航网格生成.     想借此机会整理下最近的积累,如果在阅读过程中发现 ...

  3. SpringMVC之HttpMessageConverter

    http://blog.csdn.net/zmx729618/article/details/53034420 HttpMessageConverter接口: T read(Class<? ex ...

  4. 使用jquery进行跨域操作

    ajax默认是不支持跨域操作的,只能提交跨域请求,无法获得响应.而可以用$.getScript()函数来进行跨域操作.代码如下: <button id="btnTest"&g ...

  5. LoadRunner_11破解教程完整版

    2017.12.17更正 qtm的LR11,如果是win10版本的电脑而且ie浏览器是11以上的请到loadrunner官网下载社区免费版,支持google,firefox,edge,ie11四大浏览 ...

  6. 洛谷 P2061 [USACO07OPEN]城市的地平线City Horizon

    简化版的矩形面积并,不用线段树,不用离散化,代码意外的简单 扫描线,这里的基本思路就是把要求的图形竖着切几刀分成许多矩形,求面积并.(切法就是每出现一条与y轴平行的线段都切一刀) 对于每一个切出来的矩 ...

  7. Java编码格式

    简介 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文将向你详细介绍 Java 中编码问题出现的根本原因,你将了解到:Jav ...

  8. 221 Maximal Square 最大正方形

    在一个由0和1组成的二维矩阵内,寻找只包含1的最大正方形,并返回其面积.例如,给出如下矩阵:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0返回 4. 详见:https://l ...

  9. AJPFX关于throw、throws关键字的解析

    throw.throws关键字 throw关键字: 是用于方法体内部,用来抛出一个Throwable类型的异常.如果抛出了检查异常, 则还应该在方法头部声明方法可能抛出的异常类型.该方法的调用者也必须 ...

  10. 微信小程序button授权页面,用户拒绝后仍可再次授权

    微信小程序授权页面,进入小程序如果没授权跳转到授权页面,授权后跳转到首页,如果用户点拒绝下次进入小程序还是能跳转到授权页面,授权页面如下 app.js  中的 onLaunch或onShow中加如下代 ...