通过更改scrapy源码进行spider分发实现一个综合爬虫
最近我正写一个项目,项目的需求如下
一,要爬取大约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分发实现一个综合爬虫的更多相关文章
- Scrapy源码学习(一)
用Scrapy已经有一段时间了,觉得该是看一下源码的时候了.最开始用的时候还是0.16的版本,现在稳定版已经到了0.18.结合使用Scrapy的过程,先从Scrapy的命令行看起. 一.准备 下载源代 ...
- scrapy源码分析(转)
记录一下两个讲解scrapy源码的博客: 1.http://kaito-kidd.com/2016/11/21/scrapy-code-analyze-component-initialization ...
- 2018-01-28-TF源码做版本兼容的一个粗暴方法
layout: post title: 2018-01-28-TF源码做版本兼容的一个粗暴方法 key: 20180128 tags: IT AI TF modify_date: 2018-01-28 ...
- memcached源码分析-----item过期失效处理以及LRU爬虫
memcached源码分析-----item过期失效处理以及LRU爬虫,memcached-----item 转载请注明出处:http://blog.csdn.net/luotuo44/article ...
- Twisted使用和scrapy源码剖析
1.Twisted是用Python实现的基于事件驱动的网络引擎框架. 事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定.它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的 ...
- Scrapy源码注解--CookiesMiddleware
class CookiesMiddleware(object): """ 中间件在Scrapy启动时实例化.其中jars属性是一个默认值为CookieJar对象的dict ...
- highchart导出功能的介绍更改exporting源码
本案利用highchar作为前端,展示数据的图形效果,结合spring+springmvc来完成数据图片的导出. jsp引入文件: <script src="${pageContext ...
- 更改ligerui源码实现分页样式修改
修改后样式: 第一步:实现功能. 更改源码部分ligerui.all.js文件 读源代码,发现ligerui底部工具条是这样实现的(ps:注释部分为源码) _render: function () { ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
随机推荐
- postgreSQL 创建user表时引发的表名大写与双引号问题
在postgreSQL里面,user是一个保留字. 如果你想创建user表,你可能会遭遇一些问题! 如图: 可以看到,这里是无法创建user表的. 你可能会说,我只是没有加双引号"" ...
- python正则表达式_总结
正则表达式: 作用:正则表达式是用来查找字符串的. 之前:使用正则表达式首先要导入re模块(import re) re.match -- 从字符串的第一个单词开始匹配字符串.如果匹配到则返回一个对象: ...
- SQL 初级教程学习(六)
1.创建视图 CREATE VIEW [Current Product List] ASSELECT ProductID,ProductNameFROM ProductsWHERE Discontin ...
- jenkins软件工具部署
Jenkins服务软件的安装部署 1.我们在linux安装部署Jenkins的时候,因为jenkins是一个java web程序,所以首先要保证linux系统上已经安装配置好java JDK环境,并安 ...
- CMake学习笔记四:usb_cam的CMakeLists解析
最近在学习cmake,在完整看了<cmake实践>一书后,跟着书上例程敲了跑了一遍,也写了几篇相关读书笔记,算是勉强基本入门了.所以找了usb_cam软件包的CMakeLists.txt来 ...
- 使用mysql实现mybatis的分页效果
1.mybatis.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configur ...
- windows 迁移数据库
1) Prerequisites ---------------- - The copy of the datafiles must be done with the database clos ...
- Statistics gathering and SQL Tuning Advisor
1. https://www.pythian.com/blog/statistics-gathering-and-sql-tuning-advisor/ Our monitoring software ...
- 440 K-th Smallest in Lexicographical Order 字典序的第K小数字
给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字.注意:1 ≤ k ≤ n ≤ 109.示例 :输入:n: 13 k: 2输出:10解释:字典序的排列是 [1, 10, 11, 1 ...
- Volley的初步了解
Volley的介绍 Volley是什么? 2013年Google I/O大会上推出的网络请求和图片加载框架 其优点是api简单,性能优秀 非常适合数据量不大但是通信频繁的网络请求,而对于大数据量的操作 ...