Redis 与 Scrapy:无缝集成的分布式爬虫技术

news2024/11/25 8:21:20

Python_00013.png

1. 分布式爬虫的概念

分布式爬虫系统通过将任务分配给多个爬虫节点,利用集群的计算能力来提高数据抓取的效率。这种方式不仅可以提高爬取速度,还可以在单个节点发生故障时,通过其他节点继续完成任务,从而提高系统的稳定性和可靠性。

2. Scrapy 简介

Scrapy 是一个用于快速抓取 web 数据的 Python 框架。它提供了一个异步处理的架构,可以轻松地处理大规模数据抓取任务。Scrapy 的主要特点包括:

  • 异步处理:利用 Twisted 异步网络库,Scrapy 可以同时处理多个请求,提高数据抓取的效率。
  • 强大的选择器:Scrapy 使用 lxml 或 cssselect 作为选择器,可以方便地从 HTML/XML 页面中提取数据。
  • 中间件支持:Scrapy 支持下载中间件和蜘蛛中间件,允许开发者在请求和响应处理过程中插入自定义逻辑。
  • 扩展性:Scrapy 可以轻松地与各种存储后端(如数据库、文件系统)集成。

3. Redis 简介

Redis 是一个开源的内存数据结构存储系统,用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串、哈希、列表、集合等。Redis 的主要特点包括:

  • 高性能:Redis 的数据存储在内存中,读写速度快。
  • 高可用性:通过主从复制和哨兵系统,Redis 可以提供高可用性。
  • 数据持久化:Redis 支持 RDB 和 AOF 两种持久化方式,确保数据的安全性。
  • 丰富的数据类型:Redis 支持字符串、列表、集合、有序集合、散列等多种数据类型。

4. Scrapy-Redis 架构

Scrapy-Redis 是 Scrapy 与 Redis 的集成库,它将 Scrapy 的爬虫任务和结果存储在 Redis 中。这种架构的主要优势包括:

  • 分布式处理:通过 Redis,Scrapy-Redis 可以将爬虫任务分配到多个爬虫节点,实现分布式处理。
  • 去重:利用 Redis 的集合数据类型,Scrapy-Redis 可以轻松实现 URL 的去重。
  • 任务队列:Redis 作为任务队列,可以存储待抓取的 URL,避免重复抓取。

5. Scrapy-Redis 组件

Scrapy-Redis 架构主要由以下几个组件构成:

  • Redis 服务器:作为数据存储和任务队列的后端。
  • Scrapy 爬虫:执行实际的数据抓取任务。
  • Scrapy-Redis 扩展:提供 Scrapy 与 Redis 之间的集成功能。

6. 实现 Scrapy-Redis 架构

以下是实现 Scrapy-Redis 架构的基本步骤和示例代码:
首先,需要安装 Scrapy 和 Scrapy-Redis。可以通过 pip 安装.
在 Scrapy 项目的 settings.py 文件中。
接下来,定义一个 Scrapy 爬虫,并使用 Redis 存储爬取结果。

import scrapy
from scrapy import Request
from scrapy.utils.project import get_project_settings
from scrapy.exceptions import NotConfigured
from twisted.internet import reactor
from twisted.internet.error import TimeoutError
from twisted.internet.defer import inlineCallbacks
from scrapy.http import HtmlResponse
from scrapy.utils.response import response_status_message

from scrapy_redis.spiders import RedisSpider

class ProxyMiddleware(object):
    def __init__(self, proxyHost, proxyPort, proxyUser, proxyPass):
        self.proxyHost = proxyHost
        self.proxyPort = proxyPort
        self.proxyUser = proxyUser
        self.proxyPass = proxyPass

    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings
        return cls(
            proxyHost=settings.get('PROXY_HOST'),
            proxyPort=settings.get('PROXY_PORT'),
            proxyUser=settings.get('PROXY_USER'),
            proxyPass=settings.get('PROXY_PASS')
        )

    def process_request(self, request, spider):
        proxy = f"{self.proxyUser}:{self.proxyPass}@{self.proxyHost}:{self.proxyPort}"
        request.meta['proxy'] = proxy

class MySpider(RedisSpider):
    name = 'example'
    redis_key = 'example:start_urls'

    def start_requests(self):
        yield scrapy.Request(url=self.start_urls[0], callback=self.parse)

    def parse(self, response):
        for href in response.css('a::attr(href)').getall():
            yield response.follow(href, self.parse_item)

    def parse_item(self, response):
        item = {
            'domain_id': response.url,
            'domain_name': response.url,
        }
        yield item

# settings.py
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 300,
}

DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'

SCHEDULER = 'scrapy_redis.scheduler.Scheduler'

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderQueue'
SCHEDULER_QUEUE_LIMIT = 10000

REDIS_URL = 'redis://localhost:6379'

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.ProxyMiddleware': 100,
}

PROXY_HOST = "www.16yun.cn"
PROXY_PORT = "5445"
PROXY_USER = "16QMSOML"
PROXY_PASS = "280651"

7.结论

Scrapy-Redis 架构通过将 Scrapy 的爬虫任务和结果存储在 Redis 中,实现了高效的数据抓取。这种架构不仅提高了数据抓取的效率,还增强了系统的可扩展性和稳定性。通过合理的配置和优化,可以进一步发挥 Scrapy-Redis 架构的优势,满足大规模数据抓取的需求。

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

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

相关文章

Gooxi荣获2024年深圳市计算机行业协会最具成长奖

近日,由深圳市计算机行业协会举办的2024年度深圳市计算机行业协会年中工作会议圆满落幕。本次会议邀请了多位行业专家以及深圳地区的理事会成员、企业家参会。会议的重点是总结上半年的经验,分析行业热点与痛点,探讨以新质生产力促进高质量发…

网络安全等级保护:上下文中的API安全性

网络安全等级保护:什么是API安全? 上下文中的API安全性 应用程序编程接口安全性位于多个安全学科的交叉点,如图所示。其中最重要的是以下三个领域: 1.信息安全(InfoSec)涉及在信息的整个生命周期中保护信…

Kettle下载安装

环境说明 虚拟机:Win7;MySql8.0 主机:Win11;JDK1.8;Kettle 9.4(Pentaho Data Integration 9.4)(下载方式见文末) 安装说明 【1】解压后运行Spoon.bat 【2】将jar包 复…

vue2学习 -- 核心语法

文章目录 前置简介1. 模板语法2. 数据2.1 数据绑定2.2 el与data的两种写法2.3 MVVM模型2.4 Object.defineProperty2.5 Vue中的数据代理 3. 事件3.1 事件处理3.2 事件修饰符3.3 键盘事件 4. 计算属性5. 监视(侦听)属性5.1 书写形式5.2 深度监视5.3 简写形式5.4 计算属性和监听属…

一「骑」就LUCKY!凯迪拉氪强劲动力,带你一路顺畅,幸运随行!

好运,其实就是毫不费劲的完成心里所想的事情。简单来说,是不需要太多努力,就能得到比较大的回报。每个人都希望自己拥有好运气,但这就跟抽盲盒一样,可能穷极一生都享受不到。 所以,与其期待虚无缥缈的好运…

Java线程阻塞:原因

Java线程阻塞:原因 1. sleep()2. suspend() 和 resume()(不推荐)3. yield()4. wait() 和 notify()/notifyAll() 💖The Begin💖点点关注,收藏不迷路💖 线程阻塞是一个重要的概念,它决…

移动光猫(UNG853H)获取超级帐号和密码

1.查看光猫背部的登录地址及帐密码;比如我的光猫: http://192.168.1.1 User: user password: ****** 2.启动telnet服务,使用以下命令: http://192.168.1.1/webcmcc/telnet.html 3.使用telnet登录光猫,在CMD下执行&…

【WRF安装第二期(Ubuntu)】搭建WRF编译所需系统-系统环境检验

WRF安装第二期:搭建WRF编译所需系统-系统环境检验 0 升级和安装基础环境1 系统环境检验(System Environment Tests)1.1 检验和安装基础包1.1.1 安装指令1.1.2 检验指令 1.2 WRF安装的目录结构1.2.1 WRF系统环境测试 1.3 测试编译器&#xff0…

(40)温度传感器

文章目录 前言 1 设置 2 记录 3 参数说明 前言 ArduPilot 已经有许多可能的温度报告来源:电调,智能电池,电机 EFI,这些独立的传感器可以用来取代 ArduPilot 中已经存在的那些设备温度报告。它们也可以只是被记录下来。 ArduP…

智慧环卫可视化:科技赋能城市清洁管理

图扑智慧环卫可视化通过实时监控、数据分析和智能调度,提高环卫作业效率,优化资源配置,提升城市清洁水平,实现城市管理的精细化和现代化。

【p-export-excel】一个轻松实现Excel文件导出的JavaScript插件

p-export-excel(github:https://github.com/pbstar/p-export-excel)是一个功能强大的JavaScript插件,专门用于导出Excel文件。它支持xlsx和csv两种格式,且提供了丰富的配置选项,允许开发者根据实际需求进行…

SuperMap iDesktopXiClient3D for WebGL 基于确定性空间插值生成水体流场

目录 摘要1 原始数据解析2 数据空间插值2.1流场UVW0.dat文件转xlsx2.2生成流场点数据2.3生成U、V栅格数据2.4裁剪U、V栅格数据2.5生成零值棋盘网格2.6生成U、V棋盘栅格 3 棋盘栅格转棋盘点3.1U、V棋盘栅格矢量化3.2U、V字段追加3.3流场数据JSON标准解析3.3.1流场数据JSON范例3.…

Nacos配置到springboot快速入门(笔记)

本人学习中的简单笔记,本文写的极其不详细,慎看!!! Nacos 简介 Nacos 致力于帮助开发者发现、配置和管理微服务。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及…

【RL】强化学习入门:从基础到应用

本篇文章是博主强化学习RL领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章强化学习: 强化学习…

ECRS标准工时分析软件:中小企业数字化转型的工时管理利器

在当今全球化竞争日益激烈的背景下,中小企业面临着前所未有的挑战与机遇。为了在市场中脱颖而出,实现可持续发展,数字化转型已成为不可逆转的趋势。然而,对于资源相对有限的中小企业而言,如何高效、精准地管理工时&…

昇思25天学习打卡营第9天|RNN实现情感分类

第十天的不小心把第九天的覆盖了。现在重新补上。 情感分类是自然语言处理中的经典任务,是典型的分类问题。输入一句话,然后去语义理解这句话是褒义贬义还是中性的。不同的情感语境下理解的大基调是不同的。 RRN情感分类也是一个分类模型,是…

【提问募集】向世界级软件开发大师“Bob 大叔”Robert C. Martin 提出你的疑虑!

函数式编程作为一种编程范式,其根源可以追溯到 20 世纪 30 年代,当时数学家们正在探索计算理论的基础。1936 年,阿隆佐丘奇提出了 λ 演算(Lambda Calculus),这是一种形式系统,用于表达函数抽象…

【EI会议征稿通知】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

重要信息 会议官网:www.icbase.org(查看详情) 中文主页:【往届会后3个月检索】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)_艾思科蓝_学术一站式服务平台 会议时间:2024年9月2…

【优秀python案例】基于Python的京东商城口红商品的爬虫与可视化的设计与实现

摘要:随着互联网的普及,网络购物已经成为了人们购物的首选,用户只需要在电商平台上进行自己喜欢的商品进行搜素,就可以得到成千上万条商品信息。而在购买商品时,商品价格就成为了用户的主要关注对象,而在一…

深入理解 go context

打个广告:欢迎关注我的微信公众号,在这里您将获取更全面、更新颖的文章! 原文链接:深入理解 go context 欢迎点赞关注 context 介绍 context 是 Go 语言中用于处理并发操作的一个重要概念。context也被称作上下文,主要…