Scrapy与分布式开发:scrapy-redis源码分析并实现自定义初始请求

前言

通过这篇文章架构学习(二):原生scrapy如何接入scrapy-redis,初步入局分布式,我们正式开启scrapy-redis分布式爬虫之旅,接下来我们会遇到许多业务或技术难题,期待大家一路斩将,直达胜利之门。
承接上文,笔者将开始自己的通关之旅~

关卡:如何自定义初始请求

背景

笔者现在处理的采集业务是:所有站点通过遍历列表页的方式去采集数据,一般情况下深度只有2层,所以应该算是广度遍历。
这种情况下只要构造好第一页的请求,那么后续直接替换页码即可,但如果是第一页请求需要增加cookie或者请求头配置呢,这就不能直接使用原生的请求方式了。

思考

首先我们一定要有这个意识:不是只有url才能作为名单,名单的内容与格式是由你决定的。
由于我是在开发通用采集脚本(这个有机会讲讲),所以思考内容比较多。

  1. 纯粹的GET请求,这种可以使用原生逻辑即可,页码替换只要在parse替换即可
  2. 纯粹的POST请求也可以使用原生逻辑实现,因为源码里是可以适配json格式的名单(下文源码演示)
  3. 存在反爬或者信息校验的请求时是无法使用原生逻辑的
  4. 原生请求callback默认是指向parse的,但是我又不想只指向它

简单又粗暴的方式

我们知道初始名单入口就是start_requests,那直接重写它就是了,干它,我都可以为所欲为自定义初始请求了。现在的采集基本就是这么实现的,其实无伤大雅,但是如果想开发通用采集脚本就需要更加灵活的开发方式,我们追求的是高效且灵活可控,而不是写死。(下图的BaseSpider类是我自定义的基类,它继承了RedisSpider
在这里插入图片描述

源码分析

直接看RedisSpider类,它同时继承了RedisMixinSpider
这里要科普一下,就是python中,当一个类同时继承了两个基类,它可以共用这两个基类的属性和方法,如果两个基类中定义了相同名称的方法或属性,那么Python会根据MRO(Method Resolution Order,方法解析顺序)来决定使用哪一个,MRO是Python确定如何查找和调用方法的一个规则。MRO返回的元组会包含 RedisMixin 和 Spider,并且 RedisMixin 会在 Spider 之前。这意味着当 RedisSpider 继承的方法或属性有冲突时,Python会优先使用 RedisMixin 中的定义。
在这里插入图片描述
RedisMixinSpider两个基类是都有start_requests方法的,所以RedisSpider调用的是RedisMixinstart_requests方法
在这里插入图片描述
直接跟下去,看看next_requests是啥作用。next_requests的作用是返回要调度的请求,通过下图我们就知道fetch_data是取redis队列数据的(取完就删),既然返回的是请求,那么生成请求的就是make_request_from_data方法了,看这方法的定义就知道我们离目标不远了,继续跟下去~
在这里插入图片描述
看到这里我们就确定是在make_request_from_data方法中生成的初始请求了。这里大家也就能知道,redis名单是可以存储json格式的了(不过要先转成str),而且源码很粗暴,只要不是json格式,无论是不是url都直接发起GET请求
在这里插入图片描述
所以我们只需要在自己的脚本或者类中重写make_request_from_data方法即可,只要最后返回的是请求或者空列表即可。
实现方式各异,对我而言,我做了约束,名单必须是json格式。
在这里插入图片描述

结束

这关卡算是过了,掌握了源码解析后,如果业务无法满足了,后续只需要在原有基础上继续重构就行。
好了,分享就到这了,有啥错误的地方请指正~

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python基于Scrapy-Redis分布式爬虫设计毕业源码(毕设项目).zip 该项目代码主要针对计算机、自动化等相关专业的学生从业者下载使用,项目代码都经过严格调试,确保可以运行!放心下载使用。 也可作为期末课程设计、课程大作业、毕业设计等。具有较高的学习借鉴价值!也可直接当做个人项目使用。 ## 开发环境:Python + Scrapy框架 + redis数据库 ## 程序开发工具: PyCharm 程序采用 python 开发Scrapy 框架来开发,使用 Xpath 技术对下载的网页进行提取解析,运用 Redis 数据库做分布式, 设计并实现了针对当当图书网的分布式爬虫程序,scrapy-redis是一个基于redisscrapy组件,通过它可以快速实现简单分布式爬虫程序,该组件本质上提供了三大功能: scheduler - 调度器 dupefilter - URL去重规则(被调度器使用) pipeline - 数据持久化 Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取。但是当我们要爬取的页面非常多的时候,单个主机的处理能力就不能满足我们的需求了(无论是处理速度还是网络请求的并发数),这时候分布式爬虫的优势就显现出来。 而Scrapy-Redis则是一个基于RedisScrapy分布式组件。它利用Redis对用于爬取的请求(Requests)进行存储和调度(Schedule),并对爬取产生的项目(items)存储以供后续处理使用。scrapy-redi重写了scrapy一些比较关键的代码,将scrapy变成一个可以在多个主机上同时运行的分布式爬虫。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九月镇灵将

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值