三种分布式爬虫系统的架构方式

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 分布式爬虫系统广泛应用于大型爬虫项目中,力求以最高的效率完成任务,这也是分布式爬虫系统的意义所在。分布式系统的核心在于通信,介绍三种分布式爬虫系统的架构思路,都是围绕通信开始,也就是说有多少分布式系统的通信方式就有多少分布式爬虫系统的架构思路。

分布式爬虫系统广泛应用于大型爬虫项目中,力求以最高的效率完成任务,这也是分布式爬虫系统的意义所在。


分布式系统的核心在于通信,介绍三种分布式爬虫系统的架构思路,都是围绕通信开始,也就是说有多少分布式系统的通信方式就有多少分布式爬虫系统的架构思路。


  1. Redis

    利用redis做分布式系统,最经典的就是scrapy-Redis,这是比较成熟的框架。同时我们也可以利用Redis的队列功能或者订阅发布功能来打造自己的分布式系统。

    

      Redis作为通信载体的优点是读写迅速,对爬虫的速度影响可忽略不          计,使用比较普遍。


主程序示例:

import scrapy
from scrapy.http import Request
from scrapy.selector import HtmlXPathSelector
from scrapy.dupefilter import RFPDupeFilter
from scrapy.core.scheduler import Scheduler
import redis
from ..items import XiaobaiItem

from scrapy_redis.spiders import RedisSpider
class RenjianSpider(RedisSpider):
    name = 'baidu'
    allowed_domains = ['baidu.com']

    def parse(self, response):

        news_list = response.xpath('//*[@id="content-list"]/div[@class="item"]')

        for news in news_list:

            content = response.xpath('.//div[@class="part1"]/a/text()').extract_first().strip()
            url = response.xpath('.//div[@class="part1"]/a/@href').extract_first()

            yield XiaobaiItem(url=url,content=content)

        yield Request(url='http://dig..com/',callback=self.parse)


2.RabbitMQ


RabbitMQ是比较靠谱的消息中间件,得益于它的确认机制,当一条消息消费后如果设置确定模式,那么确认后才会继续消费,如果不确定认,那么这个任务将分配给其他消费者。

基于这种确认机制,可以在高可靠性和高数据要求情景中,避免数据抓取的遗漏和丢失。


其设计思路应该是基于mq设计两个接口,一个用于URL的存放,一个用户URL的获取,同时基于Redis的URL去重,通过类似scrapy-redis 的调度使爬虫运行。


主程序示例:

import pika


class RabbitMQBASE:

    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            org = super(RabbitMQBASE, cls)
            cls._instance = org.__new__(cls)
        return cls._instance

    def __init__(self, use='root', pwd='111'):
        user_pwd = pika.PlainCredentials(use, pwd)
        self.s_conn = pika.BlockingConnection(
            pika.ConnectionParameters(host='1.1.1.1', heartbeat_interval=3600, credentials=user_pwd))

    def channel(self):
        return self.s_conn.channel()

    def close(self):
        """关闭连接"""
        self.s_conn.close()

    @staticmethod
    def callback(ch, method, properties, body):
        print(" [消费者] %r" % body)


class RabbitMQ(RabbitMQBASE):
    """
    type_:交换机类型fanout、direct、topic
    exchange:交换机名字
    queue_name:队列名字,为空则随机命名
    exclusive:队列是否持久化False持久,True不持久
    key_list:消费者的交换机、队列绑定的关键词列表
    key:生产者路由的关键词
    no_ack:是否确认消息True不确定,False确定
    "
""
    def __init__(self, use='root', pwd='Kw7pGR4xDD1CsP*U', type_='direct', exchange='test',
                 queue_name=None, exclusive=True, key_list=['test'], key='test', no_ack=True)
:
        RabbitMQBASE.__init__(self, use=use, pwd=pwd)
        self.type_ = type_
        self.exchange = exchange
        self.queue_name = queue_name
        self.exclusive = exclusive
        self.key = key
        self.key_list = key_list
        self.no_ack = no_ack

    def rabbit_get(self):
        """消费者"""
        channel = self.channel()
        channel.exchange_declare(exchange=self.exchange, exchange_type=self.type_)
        if self.queue_name == None:
            result = channel.queue_declare(exclusive=self.exclusive)
            self.queue_name = result.method.queue
        if self.type_ != 'fanout':
            for key in self.key_list:
                channel.queue_bind(exchange=self.exchange,  # 将交换机、队列、关键字绑定
                                   queue=self.queue_name, routing_key=key)
        channel.basic_consume(RabbitMQBASE.callback, queue=self.queue_name, no_ack=self.no_ack)
        channel.start_consuming()

    def rabbit_put(self, message='hello word'):
        """生产者"""
        channel = self.channel()
        channel.exchange_declare(exchange=self.exchange, exchange_type=self.type_)
        if self.type_ == 'fanout':
            self.key = ""
        channel.basic_publish(exchange=self.exchange, routing_key=self.key, body=message)
        channel.close()


3.Celery

celery典型的分布式任务队列,常用于异步操作中,如tornado、Django的异步任务中,用celery设计分布式爬虫系统,往往结合网络框架,打造一个爬虫任务接口,提供给其他人使用。


同时celery在定时任务方面有着优势,只需要在配置文件中设置一下,就可以定期执行任务,不必自己写定时操作。


celery使用消息中间件,而这个消息中间件,可以使用Redis也可以使用RabbitMQ,但他的调度不必担心,已经封装。


主程序示例:

# -*- coding:utf-8 -*-
from celery import Celery

app = Celery("tasks")
app.config_from_object("celeryconfig")  # 指定配置文件


@app.task
def taskA(x, y):
    return x + y


@app.task
def taskB(x, y, z):
    return x + y + z


@app.task
def add(x, y):
    return x + y


注意:上面的程序片段只是片段,用于示例。


综上我们应该清楚在不同的任务场景中使用甚至如何设计自己的爬虫系统,分布式爬虫系统的核心是不同主机的通信。


------------------------------


ID:Python之战


|作|者|公(zhong)号:python之战 


专注Python,专注于网络爬虫、RPA的学习-践行-总结


喜欢研究技术瓶颈并分享,欢迎围观,共同学习。


独学而无友,则孤陋而寡闻!


---------------------------

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
监控 持续交付 API
深入理解微服务架构:构建高效、可扩展的系统
【10月更文挑战第14天】深入理解微服务架构:构建高效、可扩展的系统
84 0
|
19天前
|
存储 运维 负载均衡
构建高可用性GraphRAG系统:分布式部署与容错机制
【10月更文挑战第28天】作为一名数据科学家和系统架构师,我在构建和维护大规模分布式系统方面有着丰富的经验。最近,我负责了一个基于GraphRAG(Graph Retrieval-Augmented Generation)模型的项目,该模型用于构建一个高可用性的问答系统。在这个过程中,我深刻体会到分布式部署和容错机制的重要性。本文将详细介绍如何在生产环境中构建一个高可用性的GraphRAG系统,包括分布式部署方案、负载均衡、故障检测与恢复机制等方面的内容。
71 4
构建高可用性GraphRAG系统:分布式部署与容错机制
|
8天前
|
传感器 算法 物联网
智能停车解决方案之停车场室内导航系统(二):核心技术与系统架构构建
随着城市化进程的加速,停车难问题日益凸显。本文深入剖析智能停车系统的关键技术,包括停车场电子地图编辑绘制、物联网与传感器技术、大数据与云计算的应用、定位技术及车辆导航路径规划,为读者提供全面的技术解决方案。系统架构分为应用层、业务层、数据层和运行环境,涵盖停车场室内导航、车位占用检测、动态更新、精准导航和路径规划等方面。
43 4
|
28天前
|
运维 供应链 安全
SD-WAN分布式组网:构建高效、灵活的企业网络架构
本文介绍了SD-WAN(软件定义广域网)在企业分布式组网中的应用,强调其智能化流量管理、简化的网络部署、弹性扩展能力和增强的安全性等核心优势,以及在跨国企业、多云环境、零售连锁和制造业中的典型应用场景。通过合理设计网络架构、选择合适的网络连接类型、优化应用流量优先级和定期评估网络性能等最佳实践,SD-WAN助力企业实现高效、稳定的业务连接,加速数字化转型。
SD-WAN分布式组网:构建高效、灵活的企业网络架构
|
18天前
|
前端开发 安全 关系型数据库
秒合约系统/开发模式规则/技术架构实现
秒合约系统是一种高频交易平台,支持快速交易、双向持仓和高杠杆。系统涵盖用户注册登录、合约创建与编辑、自动执行、状态记录、提醒通知、搜索筛选、安全权限管理等功能。交易规则明确,设有价格限制和强平机制,确保风险可控。技术架构采用高并发后端语言、关系型数据库和前端框架,通过智能合约实现自动化交易,确保安全性和用户体验。
|
26天前
|
存储 数据管理 调度
HarmonyOS架构理解:揭开鸿蒙系统的神秘面纱
【10月更文挑战第21天】华为的鸿蒙系统(HarmonyOS)以其独特的分布式架构备受关注。该架构包括分布式软总线、分布式数据管理和分布式任务调度。分布式软总线实现设备间的无缝连接;分布式数据管理支持跨设备数据共享;分布式任务调度则实现跨设备任务协同。这些特性为开发者提供了强大的工具,助力智能设备的未来发展。
79 1
|
1月前
|
消息中间件 关系型数据库 Java
‘分布式事务‘ 圣经:从入门到精通,架构师尼恩最新、最全详解 (50+图文4万字全面总结 )
本文 是 基于尼恩之前写的一篇 分布式事务的文章 升级而来 , 尼恩之前写的 分布式事务的文章, 在全网阅读量 100万次以上 , 被很多培训机构 作为 顶级教程。 此文修改了 老版本的 一个大bug , 大家不要再看老版本啦。
|
1月前
|
消息中间件 中间件 数据库
NServiceBus:打造企业级服务总线的利器——深度解析这一面向消息中间件如何革新分布式应用开发与提升系统可靠性
【10月更文挑战第9天】NServiceBus 是一个面向消息的中间件,专为构建分布式应用程序设计,特别适用于企业级服务总线(ESB)。它通过消息队列实现服务间的解耦,提高系统的可扩展性和容错性。在 .NET 生态中,NServiceBus 提供了强大的功能,支持多种传输方式如 RabbitMQ 和 Azure Service Bus。通过异步消息传递模式,各组件可以独立运作,即使某部分出现故障也不会影响整体系统。 示例代码展示了如何使用 NServiceBus 发送和接收消息,简化了系统的设计和维护。
48 3
|
1月前
|
存储 监控 负载均衡
|
1月前
|
传感器 存储 架构师
构建基于 IoT 的废物管理系统:软件架构师指南
构建基于 IoT 的废物管理系统:软件架构师指南
72 9
下一篇
无影云桌面