zoukankan      html  css  js  c++  java
  • Scrapy使用RabbitMQ做任务队列

    前言

    一个月没更博客了,这个月也搞了不少东西,但是公司对保密性要求挺高,很多东西都没有办法写出来
    想来想去,还是写一篇最近写Scrapy中遇到的跳转问题
    如果你的业务需求是遇到301/302/303跳转的请求时继续请求网址,直到获取到最终的真实数据为止,那么这篇文章将会非常适合你

    正文

    队列选型

    我们在使用SCRAPY中通常会使用分布式来提高爬取效率,所以需要一个任务队列来进行任务的下发,通常,该队列还承担着爬取的结果进行收集交由某几个Worker进行入库的作用
    如果使用Redis作为任务队列,推荐使用 scrapy-redis 教程很多,这里不多说
    这里着重介绍使用 RabbitMQ 作为任务队列,RabbitMQ的好处有很多,但是还是建议跟着业务走.

    使用RabbitMQ作为任务队列

    使用RabbitMQ作为任务队列的轮子很少,基本都已停止更新(17年),这里推荐一个国人的修改版,最近才开始发布,但是经本人实测已经可以正常使用
    项目地址(GitHub)scrapy-rabbitmq-scheduler
    因是国人写的,所以README文件写的通俗易懂.

    安装

    pip install scrapy-rabbitmq-scheduler

    集成至Scrapy

    在settings.py最后加入

    # 指定项目的调度器
    SCHEDULER = "scrapy_rabbitmq_scheduler.scheduler.SaaS"
    
    # 指定rabbitmq的连接DSN
    # amqp_url="amqp://username:password@ip:port/"
    RABBITMQ_CONNECTION_PARAMETERS = 'amqp://admin:pwd@x.x.x.x:5672/'
    
    # 指定重试的http状态码(重新加回队列重试)
    # 如果结果的状态码位该list其中一个则会重试
    # SCHEDULER_REQUEUE_ON_STATUS = [500]
    
    # 指定下载器中间件, 确认任务是否成功
    DOWNLOADER_MIDDLEWARES = {
        'scrapy_rabbitmq_scheduler.middleware.RabbitMQMiddleware': 999
    }
    
    # 指定item处理方式, item会加入到rabbitmq中
    ITEM_PIPELINES = {
        'scrapy_rabbitmq_scheduler.pipelines.RabbitmqPipeline': 300,
    }
    
    

    爬虫编写

    这里与Scrapy原来的方式稍有不同
    构造发送请求/接收RabbitMQ数据的方法名为 _make_request
    我们必须重构该方法才可正常运行使用爬虫
    该方法起到每次从队列中拿取数据后的解析数据并进行请求的作用
    通常我们存放在队列中的一个数据为一个JSON/msgpack格式,里面包含了要请求的URl/该条数据所属ID等多个信息
    必须要注意的是如果遇到跳转或你在setting中设置了返回状态码为xxx重新爬取,那么Scrapy会将需要重新爬取的url存放至你的队列中,此时队列中有两种格式的数据

    1. 上游生产者发送的符合你的通信协议的数据(JSON/msgpack)
    2. Scrapy自己加入的需要重新爬取的数据
      所以我们要对这两种数据加以区分
      爬虫示例

      item是对返回数据序列化的,item

      运行爬虫后,scrapy获取到的数据会转JSON传送至 res_status_ok 中(你自定义的)
      添加个Work在队列另一端接收入库或其他操作即可

    需要注意的点

    Scrapy自己插入数据到分发队列

    当时被这个问题卡了一小时,网上是没有解决方法的,他生成的数据也是不能使用常规方法进行解码的,这常常令人一头雾水

    通道设置

    该组件默认RabbitMQ持久化为True,因此请注意建立通道的时候将设置对齐否则会出现因为设置错误导致无法连接的问题

  • 相关阅读:
    pygame--颜色变化
    pyQt绘图
    pyqt布局管理器
    java执行shell/cmd命令
    word公式编辑器公式
    pygame绘制文本
    2.add two number
    eltwise层
    crop层
    fcn
  • 原文地址:https://www.cnblogs.com/chnmig/p/11987948.html
Copyright © 2011-2022 走看看