scrapy-redis

一、什么是scrapy-redis

Scrapy-Redis 是 Scrapy 框架的一个扩展,它提供了对 Redis 数据库的支持,用于实现分布式爬取。通过使用 Scrapy-Redis,你可以将多个 Scrapy 进程连接到同一个 Redis 服务器,共享任务队列和去重集,从而实现爬虫的分布式调度。

  1. 主要特点和功能包括:
  1. 分布式爬取支持: Scrapy-Redis 允许多个 Scrapy进程协同工作,它们可以在不同的机器上运行,共享任务队列和去重集,提高爬取效率。

  2. 基于 Redis 的任务调度: 使用 Redis 作为任务队列,爬虫可以从中获取待爬取的URL,实现异步的、分布式的任务调度

  3. 基于 Redis 的去重: 利用 Redis 提供的集合数据结构,Scrapy-Redis 可以在分布式环境中进行URL去重,确保相同的URL在不同的爬虫进程中不会被重复爬取

  4. 支持增量爬取: 通过保存爬取状态,Scrapy-Redis 可以支持增量爬取,爬虫可以在上次中断的位置继续执行。

  5. 使用简单: Scrapy-Redis 尽量与原生的 Scrapy保持一致,使用起来相对简单,只需添加一些配置和稍微修改爬虫代码即可实现分布式爬取。

使用 Scrapy-Redis 需要安装对应的扩展,然后在 Scrapy 项目的配置文件中进行相应的设置,如配置 Redis 的地址和端口等。通过合理配置,Scrapy-Redis 可以使你的爬虫更适应大规模和分布式的爬取任务。

  1. 示意图:

在这里插入图片描述

二、将scrapy项目改造成scrapy-redis项目

  1. 步骤
  • 1.导入scraoy_redis模块中的分布式爬虫类RedisSpider
  • 2.继承该爬虫类
  • 3.注销start_urls 和allowed_domains
  • 4.设置redis_key以获取start_urls
  • 5.设置__init__获取允许的域
  • 6.编写配置文件
  1. 例子:

普通爬虫文件:

import scrapy
class BaiduSpider(scrapy.Spider):name = "baidu"allowed_domains = ["baidu.com"]start_urls = ["http://baidu.com/","http://baidu1.com/"]def parse(self, response):# 在这里处理初始页面的响应title = response.css('h1::text').get()self.log(f'Title on page {response.url}: {title}')# 提取页面中的链接并继续爬取links = response.css('a::attr(href)').getall()for link in links:yield scrapy.Request(url=link, callback=self.parse_link)def parse_link(self, response):# 在这里处理链接页面的响应title = response.css('h1::text').get()self.log(f'Title on linked page {response.url}: {title}')# 提取链接页面中的更多链接并继续爬取more_links = response.css('a::attr(href)').getall()for more_link in more_links:# 使用 yield 关键字将请求对象输出,使其成为一个生成器。# 这样做的目的是让 Scrapy 异步执行这个请求,允许爬虫同时处理多个请求,提高爬取效率yield scrapy.Request(url=more_link, callback=self.parse_link)

改造后的文件

#将普通spider文件改为分布式spider的步骤
# 1.导入scraoy_redis中的分布式爬虫类RedisSpider
# 2.继承该爬虫类
# 3.注销start_urls 和allowed_domains
# 4.设置redis_key以获取start_urls
# 5.设置__init__获取允许的域
# 6.编写配置文件
from scrapy_redis.spiders import RedisSpider
class MyRedisSpider(RedisSpider):name='baidu'redis_key = 'baidu_spider:start_urls'def __init__(self,*arge,**kwargs):# 动态定义允许的domain list(启动时传参数,可传可不传)# scrapy runspider baidu.py -a domain=example.com,example2.com# 注意 runspider用于启动一个py文件的爬虫,而crawl则可以启动项目路径下的多个爬虫domain = kwargs.pop('domain','')# 如果你不传 'domain' 参数启动爬虫,它仍然可以正常运行# 只是 self.allowed_domains 将被设置为一个空列表,这意味着爬虫会爬取所有域名self.allowed_domains=list(filter(None,domain.split(',')))super(MyRedisSpider,self).__init__(*arge,**kwargs)def parse(self, response):title = response.css('h1::text').get()self.log(f'Title on page {response.url}: {title}')links = response.css('a::attr(href)').getall()for link in links:# 使用 yield self.make_request_from_data(link) 代替 scrapy.Requestyield self.make_request_from_data(link)def parse_link(self, response):title = response.css('h1::text').get()self.log(f'Title on linked page {response.url}: {title}')more_links = response.css('a::attr(href)').getall()for more_link in more_links:# 使用 yield self.make_request_from_data(more_link) 代替 scrapy.Requestyield self.make_request_from_data(more_link)
  • 注意 runspider用于启动一个py文件的爬虫,而crawl则可以启动项目路径下的多个爬虫

三、配置文件

#Resis 设置#使能Redis调度器SCHEDULER = 'scrapy_redis.scheduler.Scheduler'#所有spider通过redis使用同一个去重过滤器DUPEFILTER_CLASS  = 'scrapy_redis.dupefilter.RFPDupeFilter'#不清除Redis队列、这样可以暂停/恢复 爬取#SCHEDULER_PERSIST = True#SCHEDULER_QUEUE_CLASS ='scrapy_redis.queue.PriorityQueue' #默认队列,优先级队列
#备用队列。
#SCHEDULER_QUEUE_CLASS ='scrapy_redis.queue.FifoQueue'  #先进先出队列
#SCHEDULER_QUEUE_CLASS ='scrapy_redis.queue.LifoQueue'  #后进先出队列#最大空闲时间防止分布式爬虫因为等待而关闭#SCHEDULER_IDLE_BEFORE_CLOSE = 10#将抓取的item存储在Redis中以进行后续处理。ITEM_PIPELINES  = {'scrapy_redis.pipelines.RedisPipeline':300,
}# The item pipeline serializes and stores the items in this redis key.
#item pipeline 将items 序列化 并用如下key名储存在redis中#REDIS_ITEMS_KEY = '%(spider)s:items'#默认的item序列化方法是ScrapyJSONEncoder,你也可以使用自定义的序列化方式#REDIS_ITEMS_SERIALIZER = 'json.dumps'#设置redis地址 端口 密码REDIS_HOST = 'localhost'
REDIS_HOST = 6379#也可以通过下面这种方法设置redis地址 端口和密码,一旦设置了这个,则会覆盖上面所设置的REDIS_HOST和REDIS_HOSTREDIS_URL = 'redis://root:redis_pass@xxx.xx.xx.xx:6379'  #root用户名,redis_pass:你设置的redis验证密码,xxxx:你的主机ip#你设置的redis其他参数 Custom redis client parameters (i.e.: socket timeout, etc.)
REDIS_PARAMS  = {}#自定义的redis客户端类
#REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient'# If True, it uses redis ``zrevrange`` and ``zremrangebyrank`` operation. You have to use the ``zadd``
# command to add URLS and Scores to redis queue. This could be useful if you
# want to use priority and avoid duplicates in your start urls list.#REDIS_START_URLS_AS_SET = False# 默认的RedisSpider 或 RedisCrawlSpider  start urls key#REDIS_START_URLS_KEY = '%(name)s:start_urls'#redis的默认encoding是utf-8,如果你想用其他编码可以进行如下设置:#REDIS_ENCODING = 'latin1'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/239053.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集简云语聚AI新增模型测试,支持多模型同时进行交互,快速评估不同模型性能

语聚AI模型测试 在ChatGPT爆火的推动下,由生成式 AI 掀起的全球人工智能新浪潮就此拉开了序幕,人工智能也成为越来越多企业提升业务效率、优化业务流程的首选方案。 然而,面对层出不穷的AI模型,每个模型在完善度、功能性、易用性…

C语言练习记录(蓝桥杯练习)(小蓝数点)

目录 小蓝数点 第一题程序的输出结果是?: 第二题下面代码的执行结果是什么?: 第三题下面代码的执行结果是什么?: 第四题关于关系操作符说法错误的是?: 第五题对于下面代码段,y的值为? 第六题sum 21 …

UDP通信

UDP通信-快速入门 客户端程序 服务端程序 步骤 UDP通信-多发多收 客户端 服务端 步骤

掌握HarmonyOS框架的ArkTs如何管理和共享状态数据

ARKTS(Ark TypeScript)是HarmonyOS应用框架的一部分,提供了一种灵活而强大的状态管理机制。在ARKTS中,AppStorage和LocalStorage是两个关键的概念,它们分别用于应用级和页面级的状态共享。通过深入了解这两个特性&…

Sentinel核心类解读:Node

基本介绍 Sentinel中的簇点链路是由一个个的Node组成的,Node是一个接口。Node中保存了对资源的实时数据的统计,Sentinel中的限流或者降级等功能就是通过Node中的数据进行判断的。 Sentinel中是这样描述Node的: Holds real-time statistics…

Linux Spug自动化运维平台本地部署与公网远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件…

GAN:ImprovedGAN-训练GAN的改进策略

论文:https://arxiv.org/abs/1606.03498 代码:https://github.com/openai/improved_gan 发表:NIPS 2016 一、文章创新 1:Feature matching:特征匹配通过为生成器指定新目标来解决GANs的不稳定性,从而防止…

数据结构—二叉树

文章目录 10.二叉树(1).二叉树的基本概念(2).遍历#1.前序遍历#2.中序遍历#3.后序遍历#4.非递归中序遍历 (3).中序前/后序建树#1.中序前序遍历建树#2.中序后序遍历建树 (4).递归和二叉树基本操作#1.求树高#2.求结点数#3.求叶子结点数#4.复制树#5.判断两棵树是否相等 (5).特殊二叉…

无需繁琐编程 开启高效数据分析之旅!

不学编程做R统计分析:图形界面R Commander官方手册 R Commander是 R 的图形用户界面,不需要键入命令就可通过熟悉的菜单和对话框来访问 R 统计软件。 R 和 R Commander 均可免费安装于所有常见的操作系统——Windows、Mac OS X 和 Linux/UNIX。 本书作…

shareMouse 使用中遇到的问题

一、shareMouse 使用中遇到的问题 1、鼠标不能移动到另一个显示器 明明是两个显示器,但是 只显示一个,鼠标也不能移到另一个显示器上 后来, 设置了 wrap mouse pointer around display就好了,虽然还是显示一个显示器&#xff0c…

YOLOv8创新魔改教程(一)如何进行模块创新

YOLOv8创新魔改教程(一)如何进行模块创新 YOLOv8创新魔改教程 本人研一,最近好多朋友问我要如何修改模型创新模块,就想着不如直接开个专栏歇一歇文章,也算是对自己学习的总结,本专栏以YOLOv8为例&#xf…

Gee教程5.中间件

鉴权认证、日志记录等这些保障和支持系统业务属于全系统的业务,和具体的系统业务没有关联,对于系统中的很多业务都适用。 因此,在业务开发过程中,为了更好的梳理系统架构,可以将上述描述所涉及的一些通用业务单独抽离…