前言

一个月没更博客了,这个月也搞了不少东西,但是公司对保密性要求挺高,很多东西都没有办法写出来

想来想去,还是写一篇最近写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,因此请注意建立通道的时候将设置对齐否则会出现因为设置错误导致无法连接的问题

最新文章

  1. 不支持C++11 decltype的噩耗
  2. sql cross join table
  3. 快速排序(java版)
  4. IOS基础——实例变量四种范围类型
  5. Codefoces 429 D. Tricky Function
  6. xcode 升级插件失效问题
  7. extjs两个tbar问题
  8. sql中的CHARINDEX和暂时表
  9. Windows下mysql5.5主从同步
  10. PHP XML简介
  11. 利用openssl管理证书及SSL编程第1部分: openssl证书管理
  12. ubuntu快速部署gitlab汉化容器
  13. W7500S2E串口转以太网
  14. Android SDK的下载与安装
  15. hdu5521(Meeting)spfa 层次网络最短路
  16. jquery的json对象与字符串之间转换
  17. ATOM & Sublime Text 下MarkDown插件功能比较
  18. INNER JOIN与LEFT JOIN在SQL Server的性能
  19. 开源 免费 java CMS - FreeCMS1.9 移动APP管理 网站配置
  20. 7.1 - CRM系统

热门文章

  1. Scrum冲刺_Day03
  2. AcWing 380. 舞动的夜晚
  3. ThreadX——IPC应用之信号量
  4. Java IO流字符流简介及基本使用
  5. IntelliJ IDEA(十二) :IDEA常用配置
  6. Oracle数据导入Mysql中
  7. 手把手教你配置KVM服务器
  8. .NET生态系统掠影
  9. LightningChart解决方案:XY和3D图表(Polymer Char GPC-IR®-工程案例)
  10. 设计模式——责任链(结合Tomcat中Filter机制)