Scrapy 分布式爬虫框架 Scrapy-Redis

news2024/11/15 17:47:03

github官网代码示例:https://github.com/rmax/scrapy-redis/blob/master/example-project/example/spiders/myspider_redis.py

什么是 Scrapy-Redis

Scrapy-Redis 是一个基于 Scrapy 的扩展,用于实现分布式爬虫。它利用 Redis 作为分布式队列来共享待爬取的 URL 和去重数据,这样可以让多个爬虫实例(即多个爬虫节点)并行工作,从而实现大规模的分布式数据抓取。

把普通爬虫改造成分布式爬虫

使用普通爬虫,改造成分布式爬虫,更便于理解

1. 安装 scrapy_redis框架模块

pip install scrapy_redis

2. 爬虫类修改如下:

import scrapy
# --- 1. 导入分布式爬虫类
from scrapy_redis.spiders import RedisSpider


# --- 2. 继承分布式爬虫类
class BaiduSpider(RedisSpider):
    name = "baidu"

    # --- 3. 注释原来普通爬虫的 allowed_domains,start_urls
    # allowed_domains = ["baidu.com"]
    # start_urls = ["https://www.baidu.com"]

    # --- 4. 设置redis的key,起始url就存在这个key里
    redis_key = "baidu"

    # --- 5. 设置 __init__,固定写法如下
    def __init__(self, *args, **kwargs):
        domain = kwargs.pop('domain', '')
        self.allowed_domains = list(filter(None, domain.split(',')))  # 获取启动爬虫命令时输入的域名
        super().__init__(*args, **kwargs)

    def parse(self, response):
        print("解析数据:", response.xpath('//title/text()').get())

3. 配置 settings.py 文件

# myproject2 是项目名称
SPIDER_MODULES = ["myproject2.spiders"]
NEWSPIDER_MODULE = "myproject2.spiders"

# USER_AGENT = "scrapy-redis (+https://github.com/rolando/scrapy-redis)"
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"

# 重复过滤器使用的模块
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置调度器,scrapy_redis中的调度器具备与数据库交互的功能
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 保持任务队列,当程序结束时不清空 Redis 中的队列
SCHEDULER_PERSIST = True

# 设置任务队列使用的类型,可选的类型有:
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"  # 基于优先级的队列
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"          # 基于 FIFO 的队列
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"          # 基于 LIFO 的队列

ITEM_PIPELINES = {
    # "myproject2.pipelines.ExamplePipeline": 300,
    "scrapy_redis.pipelines.RedisPipeline": 400,
}

# 配置 redis 连接信息
REDIS_HOST = "localhost"
REDIS_PORT = 6379
# REDIS_DB = 0
# REDIS_PASSWORD = "123456"

LOG_LEVEL = "DEBUG"

# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
# 延迟时间,单位秒
DOWNLOAD_DELAY = 1

4. 启动分布式爬虫

在爬虫类所在目录打开多个命令行窗口,使用如下命令启动爬虫

# scrapy runspider 爬虫类
scrapy runspider baidu.py

如下:表示启动了多个程序,一起用于对这个爬虫进行爬取

5. 向redis中添加爬取的url

向redis中添加爬取的url,启动的爬虫会从redis中读取url进行爬取

# lpush key value1 value2 value3
lpush baidu "https://www.baidu.com"

6. 效果

向 redis 中存入多个url后,可以看到有多个窗口同时爬取不同url的数据

lpush baidu "https://www.baidu.com" "https://tieba.baidu.com/f?kw=沙井"

实际使用场景

当一个网站的数据特别多的时候,有很多分页,或者下拉分页。通过对分页比较找出分页规则,通过分页规则计算拿到所有的分页地址。把所有的分页地址存到 redis 中

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.NET_web前端框架_layui_栅格布局

基础概念 layui:用于简化前端编写的框架。响应式布局(Responsive Layout):一种网页设计方法,使网页能够根据不同设备的屏幕尺寸和分辨率自动调整其内容和布局。栅格布局(Grid Layout):一种网页设计布局方法&#xff0c…

计算机毕业设计选题推荐-OA办公管理系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

【IEEE出版,连续7年稳定发表】第八届电气、机械与计算机工程国际学术会议(ICEMCE 2024,10月25-27)

由西京学院主办,AEIC学术交流中心协办,中国科学技术大学、深圳大学、浙江工业大学等校联合支持的第八届电气、机械与计算机工程国际学术会议(ICEMCE 2024)将于2024年10月25日至27日在西安举办。 本次会议主要围绕“电气”、"…

电脑文件自动加解密如何实现?3个方法教会你!

电脑文件的自动加解密是一项非常实用的功能,可以帮助确保数据的安全性。 以下是三种实现电脑文件自动加解密的方法: 方法一:使用操作系统自带的加密功能 Windows BitLocker: 启用BitLocker:在Windows系统中&#xf…

SpringBoot 项目——抽奖系统

本项目主要实现的功能是:主要服务于管理员用户,其可圈选奖品,人员来创建抽奖活动,并进行在线抽奖,并可通过短信或邮件的方式通知中奖者,同时普通用户可查看已结束的抽奖活动的中奖结果; 一、项…

ViT篇外:NVIDIA Llama-3.1-Minitron 4B

相关阅读: ViT:3 Compact Architecture MobileLLM:“苗条”的模型比较好! 大家也许会很好奇为什么在ViT章节插入了NVIDIA Llama-3.1-Minitron 4B,ViT因为应用场景的特殊性所以都寄希望于高效率的模型,因…

【C语言】浮点型数据在内存中的储存

浮点型数据在内存中的储存 文章目录 浮点型数据在内存中的储存引例概念提出浮点型数据储存规定对于有效数字M的特别规定对于指数E的特别规定指数E的储存指数E的读取 利用规则解释原因 在之前学习过整形数据在内存中的储存后,浮点型数据在内存中的储存又会怎样呢&…

AI辅助论文写作已成大趋势,这些AI工具分享给你

近年来,人工智能语言模型迅速发展,特别是在美国人工智能研究实验室 OpenAI 于 2022 年 11 月发布了聊天机器人 ChatGPT 后,引发了全球范围内的广泛讨论。人们惊叹着一个新的人工智能时代已经到来,预示着许多工作将被这类机器人所取…

二叉树刷题(1)

二叉树题目讲解(1) 一、构建二叉树并且遍历(1)思路(2)代码 二、对称二叉树1、思路2、代码 三、相同的树1、思路2、代码 四、单值二叉树1、思路2、代码 五、另一棵树的子树1、思路2、代码 一、构建二叉树并且…

【Rust日报】一本新书:黑帽Rust

2024 Rust中国大会大会将于 9 月 07 日 - 08 日在上海举办。精彩议题逐步放出中,欢迎大家面对面交流。 2024 Rust中国大会报名链接暨第一批精彩演讲主题介绍 2024 Rust中国大会第二批精彩演讲主题列表 2024 Rust中国大会第三批精彩演讲主题列表 马尔科夫文本生成算法…

多线程(5)——锁策略、CAS、JUC常见类

1. 常见锁策略 1.1 乐观锁 & 悲观锁 乐观锁 & 悲观锁 也不是指具体某个锁,而是 “锁的一种特点”,描述了 “一类锁” 乐观锁:加锁的时候,假设出现锁冲突的概率不大 > 接下来围绕加锁要做的工作就会更少悲观锁&#…

minio 后端大文件分片上传,合并,删除分片

背景 网上大多数minio大文件上传都是采用后台返回前端预上传链接,然后由前端去put请求直接和minio通信上传分片文件,然后调用后台合并分片逻辑来达到快申诉上传的目的,详情可以参考我的上两篇文章 最近有个项目域名是https的,但…

# 低代码和无代码开发初探

低代码和无代码开发初探 低代码和无代码都是近年来在软件开发领域兴起的技术趋势,它们旨在提高开发效率、降低开发门槛,让更多人能够参与到软件开发过程中。以下是对低代码和无代码的介绍: 一、低代码 1、低代码定义 低代码开发平台&…

Linux nice/renice 命令 - 进程的NI、PRI属性

进程NI、PRI属性的联系 共同影响进程调度:NI和PRI都是Linux进程调度机制中的重要参数,它们共同决定了进程在CPU资源竞争中的优先级。NI值通过影响PRI值来间接影响进程的调度顺序。NI值可调整以改变PRI值:用户可以通过调整进程的NI值来间接改…

较难!第15届蓝桥杯青少组省赛Scratch中级组编程真题

今天上午第15届蓝桥杯青少组省赛Scratch初级组考完试以后,Scratch实验室就预估今天下午的Scratch中级组比较难,结果不出所料,还是比较有难度,据好几个学生及家长说,好几道题不会做时间不够。 来源:结束啦&a…

三级_网络技术_43_综合题(报文)

一、 某客户机使用DHCP获取IP地址等信息,其获取lP地址过程中捕获的4条报文及对第2条报文分析如下所示。请分析其中的信息,补全内容。 编号 报文摘要 DHCP:Request, Type:DHCP discover DHCP:Reply, Type:DHCP__________ DHCP:Request, Type:DHCP Re…

DBeaver安装使用

文章目录 简介支持的数据库支持的系统 下载安装DBeaver使用修改Maven下载jar地址窗口->首选项连接->驱动->Maven配置仓库地址 选择需要连接的数据库进行连接 简介 DBeaver 是一个通用的数据库管理工具和 SQL 客户端,支持 MySQL, PostgreSQL, Oracle, DB2,…

人生苦短,转行程序员要趁早啊

前言 最近有朋友咨询关于如何自学编程语言的问题,发现要回答这个问题,不是一俩句就可以回答清楚并减少当事人的困惑和迷茫。 笔者不知道提问者是问的学习方法还是学习路径,所以特此写一篇文章,斗胆表达一下我对自学编程的一点点…

解决Gradle下载依赖速度慢的问题

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

盘古信息MES制造执行系统,赋能制造企业智能化运营管理

随着工业智能化的不断深入,MES系统在制造业中扮演着越来越重要的角色。盘古信息自主研发的IMS MES,通过提供包括制造数据管理、计划排程管理、生产调度管理、库存管理、质量管理、人力资源管理、设备管理、采购管理、成本管理、看板管理、生产过程控制、…