Scrapy_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, 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文件
通过观察代码:
- 继承自父类为RedisSpider
- 增加了一个redis_key的键,没有start_urls,因为分布式中,如果每台电脑都请求一次start_url就会重复
- 多了
__init__
方法,该方法不是必须的,可以手动指定allow_domains - 启动方法:
- 在每个节点正确的目录下执行
scrapy crawl 爬虫名
,使该节点的scrapy_redis爬虫程序就位 - 在共用的redis中
lpush redis_key 'start_url'
,使全部节点真正的开始运行
- 在每个节点正确的目录下执行
- 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改造爬虫
- 导入scrapy_redis中的分布式爬虫类
- 继承类
- 注销start_url&allowed_domains
- 设置redis_key获取start_urls
- 设置__init__获取允许的域
2.2改造配置文件
- copy配置参数
分布式爬虫使用场景:
- 数据量特别巨大
- 数据要求时间比较紧张
分布式的实现:
- scrapy_redis实现分布式
- 普通爬虫实现分布式,实现去重集合与任务队列的共享
Scrapy_redis框架原理分析并实现断点续爬以及分布式爬虫相关推荐
- 爬虫手记(scrapy实现断点续爬,文章重点在设置)使用scrapy_redis
爬虫手记(断点续爬) 安装reids数据库 安装scrapy 安装scrapy_redis 以上自行解决. 创建项目 scrapy startprogect commit_spider 进入commi ...
- yelp mysql_Scrapy断点续爬实现抓取Yelp美食网站数据
Scrapy是一个非常强大的爬虫框架,只需极少代码便可应付一个简单爬虫. 但如果需要几十万几百万的数据量,中间一旦有中断,重新爬取则太浪费时间. 本文介绍一种思路,结合mysql,实现断点重爬的方式. ...
- Python爬虫进阶——Scrapy框架原理及分布式爬虫构建
1 Scrapy简介 1.1 概念 Scrapy是由Python语言开发的一个快速.高层次的屏幕抓取和web信息抓取框架,用于抓取web站点并从页面中提取结构化的数据. Scrapy用途广泛,可以用于 ...
- Scrapy-redis 分布式爬虫-成都安居客二手房数据爬取
Joint-spider 项目地址:GitHub Scrapy-Redis 架构: 成都贝壳,安居客房源信息爬虫 基于 python 分布式房源数据爬取系统,为房价数据挖掘及可视化提供数据支持.采用 ...
- scrapy分布式爬虫爬取淘车网
一.master主机配置 1.开启redis服务器 2.city.py#文件 # 城市编码 CITY_CODE = ['shijiazhuang', 'tangshan', 'qinhuangdao' ...
- python 保存数据单文件_python3.6 单文件爬虫 断点续存 普通版 文件续存方式
#导入必备的包#本文爬取的是顶点小说中的完美世界为列.文中的aa.text,bb.text为自己创建的text文件 importrequestsfrom bs4 importBeautifulSoup ...
- python3.6怎么保存_python 保存数据单文件_python3.6 单文件爬虫 断点续存 普通版 文件续存方式...
#导入必备的包#本文爬取的是顶点小说中的完美世界为列.文中的aa.text,bb.text为自己创建的text文件 importrequestsfrom bs4 importBeautifulSoup ...
- EHPC通过断点续算和自动伸缩在抢占式实例上实现低成本HPC计算
摘要: E-HPC 低成本计算方案 E-HPC作为阿里云上的云超算产品将HPCaaS公共云服务提供给客户,将公共云上资源弹性优势,高性能的优势,计算资源的多样性等优势提供给HPC用户,如果HPC用户追 ...
- 【神经网络扩展】:断点续训和参数提取
课程来源:人工智能实践:Tensorflow笔记2 文章目录 前言 断点续训主要步骤 参数提取主要步骤 总结 前言 本讲目标:断点续训,存取最优模型:保存可训练参数至文本 断点续训主要步骤 读取模型: ...
最新文章
- 如何在github发布个人网站或开源项目-手把手教您制作并发布个人网站或主页(二)
- mysql limit优化
- 2008 R2 Server core 下的常用命令
- oracle未过账是什么意思,EBS R12 GL过帐问题(急)
- 微服务系列实践 .NET CORE
- 详解Python中的浅复制与深复制
- C++_类和对象_C++多态_虚析构和纯虚析构函数---C++语言工作笔记074
- 尺取法 POJ 3320 Jessica's Reading Problem
- Docker一站式配置Nginx【图文教程】
- SpringBoot+Nacos 配置中心 + 服务注册与发现
- 怎么在Excel中快速将英文翻译为中文
- 《软件测试》[(美)Ron Patton]第三章阅读总结
- 织梦列表页list标签调用支持flag属性方法
- Pandas汇总不同excel工作簿中的表格并合并同类数据
- ecu故障现象_案例-报ECU系统软件重置故障处理方案
- ABAP 新特性 - CORRESPONDING
- Mac 快速查找快捷键command+f失效解决办法
- 明朝经典战役\明朝挽救历史狂澜\于谦人生最高点\北京保卫战
- 计算机 软件工程 应不应该考研?(二)
- 点云配准5 -辅助知识 最小二乘法代码实现拟合曲线(C++)