架构学习(三):scrapy-redis源码分析并实现自定义初始请求

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格式。
在这里插入图片描述

结束

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

@ResponseBody

目录 概述 用途 使用案例 用 ResponseBody 设置返回值 概述 ResponseBody注解的作用是将方法返回的对象,通过适当的转换器(HttpMessageConverter)转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据 用…

【flutter】报错 cmdline-tools component is missing

在flutterSDK目录下,双击flutter_console.bat,调出命令行。 输入flutter doctor,如果第三个诊断为[x],报cmdline-tools component is missing错(我这已经修改好了,所以是勾了),那就可…

掌握CSS网格函数fit-content()的妙用

CSS网格布局是一种强大的布局系统,它提供了灵活的网格化设计能力。其中,fit-content()函数是一项重要的功能,它可以帮助我们在网格容器中自动调整网格项的尺寸。本文将详细讲解fit-content()函数的使用方法及其常见应用场景,助你掌…

神经网络的权重是什么?

请参考这个视频https://www.bilibili.com/video/BV18P4y1j7uH/?spm_id_from333.788&vd_source1a3cc412e515de9bdf104d2101ecc26a左边是拟合的函数,右边是均方和误差,也就是把左边的拟合函数隐射到了右边,右边是真实值与预测值之间的均方…

iPhone 14支持NFC吗?如果支持,那么怎么启用

你准备好通过启用NFC来释放iPhone 14的全部潜力了吗?如果你曾经想知道如何在你的设备上利用NFC,那么你就来对地方了。 在本综合指南中,我们将引导你完成在iPhone 14上激活NFC的步骤,使你能够无缝连接其他设备,进行非接…

Rouge评估方法介绍及使用

Rouge评估方法的使用 文本摘要评估方法介绍: 内部评价方法:提供参考摘要,以参考摘要为基准评价系统摘要的质量。系统摘要与参考摘要越吻合,质量越高。 Edmundson: 适于抽取式文本摘要,比较机械文摘(自动文摘系统得到的…

Linux内核与驱动面试经典“小”问题集锦(4)

接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(3) 问题5 问:Linux内核中内存分配都有哪些方式?它们之间的使用场景都是什么? 备注:这个问题是笔者近期参加蔚来面试时遇到的一个问题。这…

对象存储minio

参考Linux搭建免费开源对象存储 wget https://dl.minio.io/server/minio/release/linux-amd64/minio yum install -y wget yum install -y wget wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio sudo mv minio /usr/local/bin/ minio --vers…

外贸人如何判断目标客户的体量大小?

海外业务中,客户不论大小,完成一次订单的所有步骤需要的时间都差不多,花费的精力也差不多。所以同等的时间,你处理的大客户的订单越多,相应的收益也会越多。 那么新人在开发客户的过程中,如何判断目标客户…

【golang】24、go get 和 go mod:indrect 与 go mod tidy

文章目录 一、go get1.1 indrect 与 go mod tidy 一、go get 操作 go.mod 文件(add、update、remove)下载依赖到 $GOPATH/pkg/mod 中若已安装,则更新该包,到最新版本 试验前置准备:首先删除已下载的依赖,…

数据结构|对称矩阵压缩存储的下标公式推导|如何求对称矩阵压缩存储对应的一维数组下标

因为考试的时候可能会给很多情况的变式题,所以要会推导而不是背公式,情况变了,公式就不管用了。 行优先、只存储主对角线下三角区: 矩阵下标 ai,j(i>j)->一维数组下标 B[k] 按照行优先的原则,确定 ai,j 是一维数…

Paper - VQGAN: Taming Transformers for High-Resolution Image Synthesis 简读

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/136055085 VQGAN: Taming Transformers for High-Resolution Image Synthesis, CVPR 2021 VQGAN: 改良 Transformer 模型以实现高清图像合成 源码…