一 scrapy-redis实现分布式爬取分析

所谓的scrapy-redis实际上就是scrapy+redis其中对redis的操作采用redis-py客户端。这里的redis的作用以及在scrapy-redis的方向我在自己fork的repository(链接:https://github.com/younghz/scrapy-redis)已经做了翻译(README.rst)。
在前面一篇文章中我已经借助两篇相关文章分析了使用redis实现爬虫分布式的中心。归结起来就是:所有爬虫获取到的url(request)都放到一个redis queue中,并且所有爬虫都从单个redis queue中获取request(url)。
scrapy-redis已经很长时间没有更新,如何是它兼容更新版本的scrapy我在博文(链接:http://blog.csdn.net/u012150179/article/details/38087661)中也已经说明,后期我可能会用较新版本的scrapr接口重写scrapy-redis。

二 分布式爬取实现

1. 对scrapy-redis中自带example的分析

在库的README中已经对example的使用做了说明,但是初步接触时运行example中的spider会存在很多疑问,比如,分布式体现在哪?是通过那几方面实现的?其次,在运行结果中很难发现分布式的影子,感觉就像两个spider在自己爬自己的东西。
对于第一种疑问,我在翻译和标注scrapy-redis中settings.py已经做了说明。而第二中疑问也是实现2中自己的example所要做的。

2. 更清晰验证scrapy-redis实现分布式的思路与编码实现。

(1)思路

实现两个爬虫,定义爬虫A爬取dmoz.com的关键词bussiness下的所有链接(通过start_urls设定)。爬虫B爬取game下的所有链接,观察二者同时运行时爬取链接的url,是各自范围的url还是二者的交集。这样由于二者定义的爬取范围是不一致的,通过爬取现象可以得出结果。

(2)实现

代码放在了github的repo中(https://github.com/younghz/scrapy-redis/)。为了易于观察,设置DEPTH_LIMIT为1。

(3)现象与分析

现象:可以发现,二者是首先同时爬取单个关键词下的链接(首先爬取哪一个取决与先运行爬虫的start_urls),完毕后进而爬取另一个关键词下链接。
分析:通过同时爬取单个关键词可以说明两个爬虫是同时被调度的,这就是爬虫的分布式。并且爬虫默认是广度优先搜索的。爬取的步骤如下:

i)首先运行爬虫A(B同理),爬虫引擎请求spider A中start_urls中的链接并交割调度器,进而引擎向调度器请求爬取的url并交给下载器下载,下载后的response交给spider,spider根据定义的rules得到链接,继续通过引擎交给调度器。(这一系列过程可查看scrapy架构)。其中调度器scheduler中request(url)顺序是redis queue实现的,也就是将request(url)push到queue中,请求时pop出来。

ii)进而启动B,同理B的start_urls首先交给了调度器(注意和A中的调度器是同一个),而B的引擎请求爬取url时,调度器调度给B下载的url还是A中没下载完成的url(默认的调度方式是先调度返回的url,并且是广度优先的),这是A和B同时下载A中未完成链接,待完成后,同时下载B的要求链接。

iii)问题:上述ii中的调度方式是怎样实现的?
在scrapy-redis中默认使用的是SpiderPriorityQueue方式,这是由sorted set实现的一种非FIFO、LIFO方式。

3. 细节分析与注意点

每次执行重新爬取,应该将redis中存储的数据清空,否则影响爬取现象。

4. 其它

request和url区别:
前者是由后者经由函数make_request_from_url实现,并且这个过程由spider完成。spider会返回(return、yield)request给scrapy引擎进而交割调度器。url也是在spider中定义或由spider获取的。
spider和crawler:

spider不同于crawler。crawler包含spider。scrapy的架构就是crawler,spider作用为:提供start_url,根据下载到的response分析获取想要的内容,继续提取url等。

https://blog.csdn.net/u012150179/article/details/38091411的更多相关文章

  1. https://blog.csdn.net/u011489043/article/details/68488459

    转自https://blog.csdn.net/u011489043/article/details/68488459 String 字符串常量   StringBuffer 字符串变量(线程安全) ...

  2. 程序员的沟通之痛https://blog.csdn.net/qq_35230695/article/details/80283720

    个人理解: 一般刚工作的程序员总觉得技术最重要.但是当工作年限超过3年.或者岗位需要涉及汇报.需求对接等就会发现沟通非常重要.也许在大公司还不那么明显,但是在小公司.小团队或者创业,沟通甚至可以说是第 ...

  3. https://blog.csdn.net/uftjtt/article/details/79044186

    https://blog.csdn.net/uftjtt/article/details/79044186

  4. 自动车牌识别(ALPR)---https://blog.csdn.net/ELEVEN_ZOU/article/details/80893579

    1.基本功能:从一张或者一系列的图片中提取车牌信息,比如车牌号码.车牌颜色等信息. 2.功能扩展:车型.车品牌.车牌类型等. 3.应用方向:电子交易系统(停车自动收费.收费站自动支付等).交通执法.交 ...

  5. Nginx 配置location root 转自https://blog.csdn.net/rofth/article/details/78581617

    nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...

  6. golang操作memcached 转自https://blog.csdn.net/weixin_37696997/article/details/78760397

    go使用memcached需要第三方的驱动库,这里有一个库是memcached作者亲自实现的,代码质量效率肯定会有保障 1:安装 go get github.com/bradfitz/gomemcac ...

  7. 爬虫出现Forbidden by robots.txt(转载 https://blog.csdn.net/zzk1995/article/details/51628205)

    先说结论,关闭scrapy自带的ROBOTSTXT_OBEY功能,在setting找到这个变量,设置为False即可解决. 使用scrapy爬取淘宝页面的时候,在提交http请求时出现debug信息F ...

  8. https://blog.csdn.net/doegoo/article/details/50749817

    因为使用DiscuzX3.2进行系统的整合后,因为只是想在原J2EE的系统上增加论坛功能,而且J2EE中已经有一套用户的注册认证的体系,所以不需要在Discuz的系统中去注册以及登录功能,而是通过在J ...

  9. windows 安装lua-5.3.4 --引用自https://blog.csdn.net/wangtong01/article/details/78296369

    版权声明:本文为博主原创文章,转载时请标明出处.http://blog.csdn.net/wangtong01 https://blog.csdn.net/wangtong01/article/det ...

随机推荐

  1. EditText输入属性

    1. android:inputType="none" android:inputType="text" android:inputType="tex ...

  2. springmvc-自定义消息转换器

    最近的项目没有用到这个,先把自己自学跑通的例子先帖出来,供自己以后参考吧! 如有不对地方望指出! 一.自定义类实现AbstractHttpMessageConverter package com.dz ...

  3. 怎么在VS监视DataSet类型的数据

    旧版本 先监视DataSet,打开dataset,dataset下面有一个tablesTables打开有一个非公共成员,然后下面有一个List,List中存储了每一张表的信息 下图所示的List下面的 ...

  4. [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛

    Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片 ...

  5. Java名称由来

              2000年度的JavaOne国际会议大厅热闹非凡,一阵阵浓郁的咖啡味儿香气扑鼻.从世界各地汇集到旧金山参加会议的Java精英们兴奋异常,排着长队,等待得到一杯由Java语言控制的咖 ...

  6. UVa 10766 Organising the Organisation(矩阵树定理)

    https://vjudge.net/problem/UVA-10766 题意: 给出n, m, k.表示n个点,其中m条边不能直接连通,求生成树个数. 思路: 这也算个裸题,把可以连接的边连接起来, ...

  7. springmvc+druid+dataSource配置的两种方式

    一.一般的配置方式 数据库连接配置在jdbc.properties文件中,这种方式有一个最大的缺点,数据库的配置信息对开发人员是完全可见的,十分方便程序员删库跑路.spring配置具体如下: 1.jd ...

  8. redis教程(The little redis book中文版)

    许可证 <The Little Redis Book>是经由Attribution-NonCommercial 3.0 Unported license许可的,你不需要为此书付钱. 你可以 ...

  9. Qt5.3.2(VS2010)_调试_遇到的问题

    1.(20171124)调试程序 的时候,一直卡住,看到 右下角的进度里面,一直是"Launching Debugger"的状态 ZC: 一直找不到 原因... 尝试了 32位/6 ...

  10. lua_VC6环境

    1. 下载得到 lua-5.1.4.tar.gz,解压得到 文件夹"lua-5.1.4" 2. 视频[02:00] 将 lua-5.1.4/etc/luavs.bat 复制到 lu ...