scrapy-redis实现爬虫分布式爬取分析与实现
本文链接:http://blog.csdn.net/u012150179/article/details/38091411
一 scrapy-redis实现分布式爬取分析
所谓的scrapy-redis实际上就是scrapy+redis当中对redis的操作採用redis-pyclient。这里的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. 其他
前者是由后者经由函数make_request_from_url实现,而且这个过程由spider完毕。
spider会返回(return、yield)request给scrapy引擎进而交割调度器。url也是在spider中定义或由spider获取的。
spider不同于crawler。crawler包括spider。scrapy的架构就是crawler。spider作用为:提供start_url,依据下载到的response分析获取想要的内容,继续提取url等。
原创,本文链接:http://blog.csdn.net/u012150179/article/details/38091411
scrapy-redis实现爬虫分布式爬取分析与实现的更多相关文章
- 【Python3爬虫】爬取美女图新姿势--Redis分布式爬虫初体验
一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...
- Scrapy 分布式爬取
由于受到计算机能力和网络带宽的限制,单台计算机运行的爬虫咋爬取数据量较大时,需要耗费很长时间.分布式爬取的思想是“人多力量大”,在网络中的多台计算机同时运行程序,公童完成一个大型爬取任务, Scrap ...
- scrapy进阶(CrawlSpider爬虫__爬取整站小说)
# -*- coding: utf-8 -*- import scrapy,re from scrapy.linkextractors import LinkExtractor from scrapy ...
- Scrapy-redis实现分布式爬取的过程与原理
Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的时候,单个主机的处理能力就不能满足我们的需求了(无论是处理速度还是网络请求 ...
- scrapy-redis + Bloom Filter分布式爬取tencent社招信息
scrapy-redis + Bloom Filter分布式爬取tencent社招信息 什么是scrapy-redis 什么是 Bloom Filter 为什么需要使用scrapy-redis + B ...
- scrapy-redis分布式爬取tencent社招信息
scrapy-redis分布式爬取tencent社招信息 什么是scrapy-redis 目标任务 安装爬虫 创建爬虫 编写 items.py 编写 spiders/tencent.py 编写 pip ...
- Scrapy 通过登录的方式爬取豆瓣影评数据
Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来 ...
- Python爬虫项目--爬取链家热门城市新房
本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确 ...
- 网络爬虫之定向爬虫:爬取当当网2015年图书销售排行榜信息(Crawler)
做了个爬虫,爬取当当网--2015年图书销售排行榜 TOP500 爬取的基本思想是:通过浏览网页,列出你所想要获取的信息,然后通过浏览网页的源码和检查(这里用的是chrome)来获相关信息的节点,最后 ...
随机推荐
- Installing — pylibmc 1.2.3 documentation
Installing - pylibmc 1.2.3 documentation libmemcached
- python-MySQL库简单安装
1 raise EnvironmentError("%s not found" % (mysql_config.path,)) EnvironmentError: mysql_c ...
- 找不到eth0,但能找到eth1的问题解决办法
故障现象:Linux的网卡由eth0变成了eth1,如何修复?解决方案:在linux中,udev记录网络规则的脚本为:/etc/udev/rules.d/70-persistent-net.rules ...
- 采用标准c进行目录文件遍历
图像处理的时候经常需要对一个目录的所有图像进行处理,遍历文件得c代码: 在windows中需要使用到宽字符. 另外,可以使用opencv封装的目录访问操作,下次给出. // DirTraverse.c ...
- ADO.net基础学习总结
ADO.net是一门.net连接.操作数据库的技术 释放资源:凡是实现了idisposable借口的类都需要用using来释放资源 using() { } 连接数据库 //创建数据库连接: usi ...
- 推荐10款 好用的 Jquery 评分插件
Raty jQuery Raty这是一个能够自动生成可定制的星级评分jQuery插件.可以自定义图标,创建各种评级组合,星星数量,每一颗星星的注释,可以在当一个星星被点击时的加回调函数. 地址: Ra ...
- RFC端口号定义
RFC关于计算机端口号定义 http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers. ...
- select count(distinct a)
我想对一个表里面字段a的个数进行进行统计,因为字段a有重复的记录,我想排除重复的记录,该sql语句为: select count(distinct a) 链接:http://www.w3school. ...
- 介绍一款管理软件Redmine
Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统,据说是源于Basecamp的ror版而来,支持多种数据库,有不少自己独特的功能,例如提供wiki. ...
- B - A + B Again
Description There must be many A + B problems in our HDOJ , now a new one is coming. Give yo ...