Scrapy_redis框架原理分析并实现断点续爬以及分布式爬虫_scrapy-redis demo-程序员宅基地

技术标签: 爬虫  python  分布式  redis  

1. 下载github的demo代码

1.1 clone github scrapy-redis源码文件

git clone https://github.com/rolando/scrapy-redis.git

 cd到示例项目中:

安装缺少的scrapy-redis模块: pip install scrapy-redis

 启动爬虫:

 把启动的爬虫中止,在RDM中查看爬虫的结果:

 此时发现数据队列中有174条数据,接下来继续启动爬虫,观察数据的变化:

 以上就实现断点续爬

1.2 研究项目自带的demo

mv scrapy-redis/example-project ~/scrapyredis-project

2. 观察dmoz文件

        在domz爬虫文件中,实现方式就是crawlspider类型的爬虫。

dmoz.py文件

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class DmozSpider(CrawlSpider):
    """Follow categories and extract links."""
    name = 'dmoz'
    allowed_domains = ['dmoz-odp.org']
    start_urls = ['http://www.dmoz-odp.org/']

    # 定义数据提取规则,使用了css选择器
    rules = [
        Rule(LinkExtractor(
            restrict_css=('.top-cat', '.sub-cat', '.cat-item')
        ), callback='parse_directory', follow=True),
    ]

    def parse_directory(self, response):
        for div in response.css('.title-and-desc'):
            yield {
                'name': div.css('.site-title::text').extract_first(),
                'description': div.css('.site-descr::text').extract_first().strip(),
                'link': div.css('a::attr(href)').extract_first(),
            }

        在settings.py中多了以下内容,这几行表示scrapy_redis中重新实现的了去重的类,以及调度器,并且使用RedisPipeline管道类

#  设置重复过滤器的模块
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
#  设置调取器, scrapy_redis中的调度器具备与数据库交互的功能
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
#  设置当爬虫结束的时候是否保持redis数据库中的去重集合与任务队列
SCHEDULER_PERSIST = True

ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    #  当开启该管道,该管道将会把数据库存到redis数据库中
    'scrapy_redis.pipelines.RedisPipeline': 400,
}
#  设置redis数据库
REDIS_URL = "redis://127.0.0.1:6379"

3. 运行dmoz爬虫,观察现象

3.1首先需要添加redis的地址,程序才能够使用redis

REDIS_URL = "redis://127.0.0.1:6379"
#或者使用下面的方式
# REDIS_HOST = "127.0.0.1"
# REDIS_PORT = 6379

3.2执行domz的爬虫,会发现redis中多了一下三个键:

3.3中止进程后再次运行dmoz爬虫

        继续执行程序,会发现程序在前一次的基础之上继续往后执行,所以domz爬虫是一个基于url地址的增量式的爬虫

4. scrapy_redis的原理分析

从settings.py中的三个配置来进行分析 分别是:

  • RedisPipeline # 管道类
  • RFPDupeFilter # 指纹去重类
  • Scheduler # 调度器类
  • SCHEDULER_PERSIST # 是否持久化请求队列和指纹集合

4.1 Scrapy_redis之RedisPipeline

RedisPipeline中观察process_item,进行数据的保存,存入了redis中

4.2 Scrapy_redis之RFPDupeFilter

RFPDupeFilter 实现了对request对象的加密

4.3 Scrapy_redis之Scheduler

scrapy_redis调度器的实现了决定什么时候把request对象加入带抓取的队列,同时把请求过的request对象过滤掉

4.4 request对象入队的条件

  • request的指纹不在集合中
  • request的dont_filter为True,即不过滤
    • start_urls中的url地址会入队,因为他们默认是不过滤

5. 实现分布式爬虫

5.1 分析demo中代码

打开example-project项目中的myspider_redis.py文件

通过观察代码:

  1. 继承自父类为RedisSpider
  2. 增加了一个redis_key的键,没有start_urls,因为分布式中,如果每台电脑都请求一次start_url就会重复
  3. 多了__init__方法,该方法不是必须的,可以手动指定allow_domains
  4. 启动方法:
    1. 在每个节点正确的目录下执行scrapy crawl 爬虫名,使该节点的scrapy_redis爬虫程序就位
    2. 在共用的redis中 lpush redis_key 'start_url',使全部节点真正的开始运行
  5. settings.py中关键的配置
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True

ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_URL = "redis://127.0.0.1:6379"

5.2 实现分布式爬虫

以书山有路网为例:详情查看博客:Scrapy_redis框架分布式爬虫的实现案例-书山有路网_IT之一小佬的博客-程序员宅基地

注意:启动方式可以用别的方式:scrapy runspider book.py   可以用相对路径,也可以用绝对路径

分布式爬虫的编写流程:

1.编写普通爬虫

  • 创建项目
  • 明确目标
  • 创建爬虫
  • 保存内容

2.改造成分布式爬虫

2.1改造爬虫

  1. 导入scrapy_redis中的分布式爬虫类
  2. 继承类
  3. 注销start_url&allowed_domains
  4. 设置redis_key获取start_urls
  5. 设置__init__获取允许的域

2.2改造配置文件

  • copy配置参数

分布式爬虫使用场景:

  • 数据量特别巨大
  • 数据要求时间比较紧张

分布式的实现:

  • scrapy_redis实现分布式
  • 普通爬虫实现分布式,实现去重集合与任务队列的共享
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44799217/article/details/113811673

智能推荐

Python基础之time模块_python timeer-程序员宅基地

文章浏览阅读1.4k次。Python基础之time模块1.引入time模块import time2.获取时间戳(1)time.time()获取当前时间戳time1 = time.time()# 1532352941.8780842(2)time.localtime([sec]) 将时间戳格式化为本地时间,sec为指定时间戳,默认为当前时间time1 = time.loca..._python timeer

linux环境下使用netstat命令查看网络信息_linux netstat -ano-程序员宅基地

文章浏览阅读3.6k次,点赞2次,收藏13次。`netstat` 这个命令一直以为是 net status 的缩写,今天一查发现并没有找到官方的这种说法,然后参考了 man 手册,发现这个词更像是 net statistics 的缩写,命令的作用是显示网络连接、路由表、接口连接、无效连接和多播成员关系的..._linux netstat -ano

Sqlmap使用详解_--tamper=space2comment-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏26次。目录SqlmapSqlmap的简单用法探测指定URL是否存在SQL注入漏洞查看数据库的所有用户(--users)查看数据库所有用户名的密码(--passwords)查看数据库当前用户(--current-user)判断当前用户是否有管理权限(--is-dba列出数据库管理员角色(--roles)查看所有的数据库(--dbs)查看当前的数据库(--current-db)爆出指定数据库中的所有的表爆..._--tamper=space2comment

burst什么意思_burst是什么意思_burst的用法-程序员宅基地

文章浏览阅读4.3k次。burst的音标英 [bɜːst]美 [bɜːrst]burst的用法v. (使)爆裂,胀开;猛冲;突然出现;爆满;涨满n. 突发;猝发;迸发;爆破;爆裂;裂口;一阵短促的射击第三人称单数: bursts 现在分词: bursting 过去式: burst 过去分词: burstburst的例句1.The driver lost control when a tyre burst一个车胎爆了,司机..._burst

第四章 IP地址和子网划分_判断属于哪个、子网-程序员宅基地

文章浏览阅读1.1k次。4.1 理解IP地址MAC地址和IP地址数据包的目标IP地址决定了数据包最终到达哪一个计算机,而目标MAC地址决定了该数据包下一跳由哪一个设备接收,不一定是终点MAC地址决定下一跳给哪个设备IP地址决定数据包最终给哪个计算机IP地址的组成计算机的IP地址由两部分组成,一部分为网络标识,一部分为主机标识,同一网段的计算机网络部分相同,路由器连接不同网段,负责不同网段之间的数据转发,交换..._判断属于哪个、子网

SpringBoot实现身份证实名认证(阿里云实现)_springboot 身份证-程序员宅基地

文章浏览阅读2.4k次。文章目录 1、功能展示 2、购买API 3、 API 文档 4、SpringBoot集成身份认证 4.1、IdProperties 4.2、IdAutoConfiguration 4.3、完成身份认证 4.3.1抽取 GeetestForm: 4.3.2、UserAuthForm 4.3.3、UserController: 4.3.4、UserService: 4.3.5、UserServiceImpl 4.3.6_springboot 身份证

随便推点

2024计算机考研《操作系统考研通关800题》下载分享_操作系统考研真题网盘-程序员宅基地

文章浏览阅读83次。B、中程调度的主要功能是当内存紧张是挂起部分暂时不运行的进程,并在内存有空闲时激活部分被挂起的进程,以提高内存利用与和系统吞吐量。[P1638] 在对记录型信号量的wait操作的定义中,当信号量的值( )时,执行wait操作的进程变为阻塞状态。[P1648] 作业的操作分为若干作业步,一个典型作业操作通常分为三个作业步,下列错误的是( )[P1637] 已知记录型信号量S,当前S.value的值为-5,下列选项错误的是( )A.用户数越少 B.用户数越多 C.内存越小 D.内存越大。_操作系统考研真题网盘

HadoopWindows权限异常_hadoop 正尝试在 windows 操作系统上使用 posix 文件权限相关的 api,导致该异-程序员宅基地

文章浏览阅读335次。1:报错如下java.io.IOException: (null) entry in command string: null chmod 0644复制代码解决方案1.下载winutils的windows版本在hadoop2.7.x版本里,请使用:https://github.com/SweetInk/hadoop-common-2.7.1-bin随便解压到一个目录,将加压出来的bin..._hadoop 正尝试在 windows 操作系统上使用 posix 文件权限相关的 api,导致该异常的

【仙女踩坑实录】python3.6 anaconda安装pytorch/python/torchvision/cudatoolkit以及版本对应_torch与conda对应-程序员宅基地

文章浏览阅读5.9k次,点赞7次,收藏45次。图自https://blog.csdn.net/abc13526222160/article/details/86497684_torch与conda对应

【springmvc】对国际化的支持_i18n accept-language-程序员宅基地

文章浏览阅读2.2k次。准备工作国际化的准备工作如下:向容器中注入@Bean public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("i18n"); // 资源文件 messageSource.setDefaultEncoding("U_i18n accept-language

bpmn事件_bpmn 事件-程序员宅基地

文章浏览阅读1.3w次。本文章主要讲解bpmn事件,系列文章包含工作流、工作流系统、工作流引擎的相关讲解,涉及的到Camunda BPM、BPMN规范、activit的基础性知识,对于流程自动化、业务流程等进行了深入研究探讨。_bpmn 事件

【必读】清华差生十年的奋斗经历-管理,你需要腾挪出一个空间_时间腾挪出空间-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏5次。秀才推荐这是一篇曾经非常火的文章特别是以下这几句: 现随着普通劳动者的工资越来越高,读书无用论的说法也越来越甚。我觉得首先这是对以前大学生高高在上的一种不正常的风气的反弹,那时大学生稀缺,身价虚高,仿佛读了大学就高人一等,毫不费力得拿高工资,凭什么? 同样付出劳动,同样创造价值,就应该得到合理的收获;终于人们发现不是所有的大学生就一定比农民工干得好,有时不是抛出名校研究生卖猪肉之类的新闻,让长..._时间腾挪出空间