本文链接: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. 其他

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等。

原创,本文链接:http://blog.csdn.net/u012150179/article/details/38091411

scrapy-redis实现爬虫分布式爬取分析与实现的更多相关文章

  1. 【Python3爬虫】爬取美女图新姿势--Redis分布式爬虫初体验

    一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...

  2. Scrapy 分布式爬取

    由于受到计算机能力和网络带宽的限制,单台计算机运行的爬虫咋爬取数据量较大时,需要耗费很长时间.分布式爬取的思想是“人多力量大”,在网络中的多台计算机同时运行程序,公童完成一个大型爬取任务, Scrap ...

  3. scrapy进阶(CrawlSpider爬虫__爬取整站小说)

    # -*- coding: utf-8 -*- import scrapy,re from scrapy.linkextractors import LinkExtractor from scrapy ...

  4. Scrapy-redis实现分布式爬取的过程与原理

    Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的时候,单个主机的处理能力就不能满足我们的需求了(无论是处理速度还是网络请求 ...

  5. scrapy-redis + Bloom Filter分布式爬取tencent社招信息

    scrapy-redis + Bloom Filter分布式爬取tencent社招信息 什么是scrapy-redis 什么是 Bloom Filter 为什么需要使用scrapy-redis + B ...

  6. scrapy-redis分布式爬取tencent社招信息

    scrapy-redis分布式爬取tencent社招信息 什么是scrapy-redis 目标任务 安装爬虫 创建爬虫 编写 items.py 编写 spiders/tencent.py 编写 pip ...

  7. Scrapy 通过登录的方式爬取豆瓣影评数据

    Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来 ...

  8. Python爬虫项目--爬取链家热门城市新房

    本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确 ...

  9. 网络爬虫之定向爬虫:爬取当当网2015年图书销售排行榜信息(Crawler)

    做了个爬虫,爬取当当网--2015年图书销售排行榜 TOP500 爬取的基本思想是:通过浏览网页,列出你所想要获取的信息,然后通过浏览网页的源码和检查(这里用的是chrome)来获相关信息的节点,最后 ...

随机推荐

  1. poj 1088 动态规划+dfs(记忆化搜索)

    滑雪 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   Description Mi ...

  2. 一个简单的算法,定义一个长度为n的数组,随机顺序存储1至n的的全部正整数,不重复。

    前些天看到.net笔试习题集上的一道小题,要求将1至100内的正整数随机填充到一个长度为100的数组,求一个简单的算法. 今天有空写了一下.代码如下,注释比较详细: using System; usi ...

  3. Mac 下纯lua(二)

    Lua库 基本函数 assert(v,[,message]) 当v时false时,返回message assert(money >0,"error -1001"); coll ...

  4. FMDB使用

    FMDBManager.h #import <Foundation/Foundation.h> #import "FMDatabase.h" @interface FM ...

  5. IOS 排序算法

    /** * @brief 冒泡排序法 * * @param arr 需要排序的数组 */ -(void)BubbleSort:(NSMutableArray *)arr { // 取第一个与其邻接的对 ...

  6. mysql密码忘记如何处理

    1,修改/etc/my.cnf添加添加skip-grant参数,重启mysql. 2,登录mysql  mysql -uroot 3, 更新user中root的密码  use mysql;   upd ...

  7. SQL Server 2008 修改表名

     有一张表  修改起 if exists (select * from sys.objects where object_id = object_id(N'Table_1') and type in ...

  8. SFTP CONFIGURATION IN FLASHFXP PROGRAM

    This is a brief guide on how to configure the FlashFXP FTP client to log on to the domain web space ...

  9. 查看Android数据库文件

    使用Eclipse DDMS的File Explorer不能能看到Data目录下面的东西,可能由下面原因引起的 手机没有Root  -- 可以使用Root大师 Data文件权限不够 -- 可以使用Ro ...

  10. MySQL安装配置过程

    1.下载压缩包,解压: 2: 修改  my-default.ini 文件 将一下代码前# 去掉修改成自己的地址 # These are commonly set, remove the # and s ...