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)来获相关信息的节点,最后 ...
随机推荐
- Android专项面试训练题(一)
1.下面不可以退出Activity的是?(D) A.finish() B.抛异常强制退出 C.System.exit(0) D.onStop() 解析: A, finish() 方法就是退出activ ...
- MAC 下cocos2d-x lua 使用dragonbones的方法
项目使用db,网上查了半天全是vs和android的流程,没查到有mac的.这里记录一下. quick-cocos-x下的使用方法: a. 将dragonbones(放入ucocos2d_libs中) ...
- 棋盘覆盖(大数阶乘,大数相除 + java)
棋盘覆盖 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...
- RAID技术介绍和总结
简介 RAID是一个我们经常能见到的名词.但却因为很少能在实际环境中体验,所以很难对其原理 能有很清楚的认识和掌握.本文将对RAID技术进行介绍和总结,以期能尽量阐明其概念. RAID全称为独立磁盘冗 ...
- 淘宝开源任务调度框架tbschedule
背景 分布式任务调度是非常常见的一种应用场景,一般对可用性和性能要求不高的任务,采用单点即可,例如linux的crontab,spring的quarz,但是如果要求部署多个节点,达到高可用的效果,上面 ...
- winform —— 常用控件
1.textbox: 属性:text: 文本selectedtext: 获或设置选中文本canundo: 是否能够撤销 passwordchar:替换字符实现密码 ...
- Linux下重要日志文件及查看方式
http://os.51cto.com/art/201108/282184_all.htm 1.Linux下重要日志文件介绍 /var/log/boot.log 该文件记录了系统在引导过程中发生的 ...
- iOS基本内存管理:autorelease和autoreleasepool
1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自 ...
- HDU 1065 - I Think I Need a Houseboat
又是恶心人的水题 圆周率取3.1415926就啥事没有.. #include <iostream> #include <cstdio> #include <cmath&g ...
- Gallery过时替代方案HorizontalScrollView
布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:androi ...