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, Ruleclass 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 = TrueITEM_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 = TrueITEM_PIPELINES = {'example.pipelines.ExamplePipeline': 300,'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_URL = "redis://127.0.0.1:6379"

5.2 实现分布式爬虫

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

注意:启动方式可以用别的方式: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实现分布式
  • 普通爬虫实现分布式,实现去重集合与任务队列的共享

Scrapy_redis框架原理分析并实现断点续爬以及分布式爬虫相关推荐

  1. 爬虫手记(scrapy实现断点续爬,文章重点在设置)使用scrapy_redis

    爬虫手记(断点续爬) 安装reids数据库 安装scrapy 安装scrapy_redis 以上自行解决. 创建项目 scrapy startprogect commit_spider 进入commi ...

  2. yelp mysql_Scrapy断点续爬实现抓取Yelp美食网站数据

    Scrapy是一个非常强大的爬虫框架,只需极少代码便可应付一个简单爬虫. 但如果需要几十万几百万的数据量,中间一旦有中断,重新爬取则太浪费时间. 本文介绍一种思路,结合mysql,实现断点重爬的方式. ...

  3. Python爬虫进阶——Scrapy框架原理及分布式爬虫构建

    1 Scrapy简介 1.1 概念 Scrapy是由Python语言开发的一个快速.高层次的屏幕抓取和web信息抓取框架,用于抓取web站点并从页面中提取结构化的数据. Scrapy用途广泛,可以用于 ...

  4. Scrapy-redis 分布式爬虫-成都安居客二手房数据爬取

    Joint-spider 项目地址:GitHub Scrapy-Redis 架构: 成都贝壳,安居客房源信息爬虫 基于 python 分布式房源数据爬取系统,为房价数据挖掘及可视化提供数据支持.采用 ...

  5. scrapy分布式爬虫爬取淘车网

    一.master主机配置 1.开启redis服务器 2.city.py#文件 # 城市编码 CITY_CODE = ['shijiazhuang', 'tangshan', 'qinhuangdao' ...

  6. python 保存数据单文件_python3.6 单文件爬虫 断点续存 普通版 文件续存方式

    #导入必备的包#本文爬取的是顶点小说中的完美世界为列.文中的aa.text,bb.text为自己创建的text文件 importrequestsfrom bs4 importBeautifulSoup ...

  7. python3.6怎么保存_python 保存数据单文件_python3.6 单文件爬虫 断点续存 普通版 文件续存方式...

    #导入必备的包#本文爬取的是顶点小说中的完美世界为列.文中的aa.text,bb.text为自己创建的text文件 importrequestsfrom bs4 importBeautifulSoup ...

  8. EHPC通过断点续算和自动伸缩在抢占式实例上实现低成本HPC计算

    摘要: E-HPC 低成本计算方案 E-HPC作为阿里云上的云超算产品将HPCaaS公共云服务提供给客户,将公共云上资源弹性优势,高性能的优势,计算资源的多样性等优势提供给HPC用户,如果HPC用户追 ...

  9. 【神经网络扩展】:断点续训和参数提取

    课程来源:人工智能实践:Tensorflow笔记2 文章目录 前言 断点续训主要步骤 参数提取主要步骤 总结 前言 本讲目标:断点续训,存取最优模型:保存可训练参数至文本 断点续训主要步骤 读取模型: ...

最新文章

  1. 如何在github发布个人网站或开源项目-手把手教您制作并发布个人网站或主页(二)
  2. mysql limit优化
  3. 2008 R2 Server core 下的常用命令
  4. oracle未过账是什么意思,EBS R12 GL过帐问题(急)
  5. 微服务系列实践 .NET CORE
  6. 详解Python中的浅复制与深复制
  7. C++_类和对象_C++多态_虚析构和纯虚析构函数---C++语言工作笔记074
  8. 尺取法 POJ 3320 Jessica's Reading Problem
  9. Docker一站式配置Nginx【图文教程】
  10. SpringBoot+Nacos 配置中心 + 服务注册与发现
  11. 怎么在Excel中快速将英文翻译为中文
  12. 《软件测试》[(美)Ron Patton]第三章阅读总结
  13. 织梦列表页list标签调用支持flag属性方法
  14. Pandas汇总不同excel工作簿中的表格并合并同类数据
  15. ecu故障现象_案例-报ECU系统软件重置故障处理方案
  16. ABAP 新特性 - CORRESPONDING
  17. Mac 快速查找快捷键command+f失效解决办法
  18. 明朝经典战役\明朝挽救历史狂澜\于谦人生最高点\北京保卫战
  19. 计算机 软件工程 应不应该考研?(二)
  20. 点云配准5 -辅助知识 最小二乘法代码实现拟合曲线(C++)

热门文章

  1. Python画出心目中的自己
  2. 求助贴:人工智能offer,阿里or腾讯,选哪个?
  3. Uber 前无人驾驶工程师告诉你,国内无人驾驶之路还要走多久?
  4. 300道Python面试题,备战春招!
  5. 阿里团队最新实践:如何解决大规模分类问题?
  6. 科技部公布2017年独角兽名单,来看看有哪些人工智能企业?
  7. SpringBoot+flowable快速实现工作流,so easy!
  8. 面进了心心念念的国企!以为TM上岸了!干了1年!我却再次选择回到互联网大厂内卷!
  9. 那些总是写“烂代码”的同学,强烈推荐你用这款IDEA插件!
  10. 感受 lambda 之美!