本文链接: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. hdu - 4651 - Partition

    题意:把一个整数N(1 <= N <= 100000)拆分不超过N的正整数相加,有多少种拆法. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid ...

  2. ChromiumFX中js调用C#方法

    server端代码: ChromiumWebBrowser wb; wb.AddGlobalJSFunction("CfxHelloWorld").Execute += CfxHe ...

  3. 频繁模式挖掘apriori算法介绍及Java实现

    频繁模式是频繁地出如今数据集中的模式(如项集.子序列或者子结构).比如.频繁地同一时候出如今交易数据集中的商品(如牛奶和面包)的集合是频繁项集. 一些基本概念 支持度:support(A=>B) ...

  4. 表设计与SQL优化

    1. 说说分区表的主要好处是什么,为什么会有这些好处. 分区功能能够将表.索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区.每个分区有自己的名称,还可以选择自己的存储特性. 从数据库管理员的 ...

  5. c# 调用EXCEL在VS上能正常运行,部署在IIS上不能实现,在VS中运行页面和发布之后在IIS中运行的区别

    发现一篇文章,很好,解决了这个问题:感谢原博主!特此做个笔记. 地址:http://www.cnblogs.com/zhongxinWang/p/3275154.html 发布在IIS上的Web程序, ...

  6. setlocal enabledelayedexpansion

    http://www.jb51.net/article/29323.htm 例1: 代码如下: @echo off set a=4 set a=5&echo %a% pause  结果:4 解 ...

  7. 基于excel9.h的excel处理

    基于excel9.h的excel处理; #include "excel9.h" #include <iostream> using namespace std; cla ...

  8. Java通过axis调用WebService

    上午头给了我一个任务,让我对接别的公司的webservice接口,各种百度,看的头晕脑花的,终于通了,记录一下吧. jar包奉上,http://pan.baidu.com/s/1jSchC 包含:ax ...

  9. myEclipse + phonegap-2.9.0 总跳出3个脚本提示

    环境:myEclipse + phonegap-2.9.0按照教程全部完毕后,浏览页面时,总会跳出3个脚本提示:1:gap:["Device","getDeviceInf ...

  10. 优酷播放器demo

    <!DOCTYPE html> <html lang="en-US"> <head> <meta http-equiv="Con ...