scrapy爬虫中间件和下载中间件的使用

news/2024/7/19 8:46:56 标签: scrapy, 爬虫, 中间件

一、关于中间件

之前文章说过,scrapy有两种中间件爬虫中间件和下载中间件,他们的作用时间和位置都不一样,具体区别如下:

  1. 爬虫中间件(Spider Middleware)

作用: 爬虫中间件主要负责处理从引擎发送到爬虫的请求和从爬虫返回到引擎的响应。这些中间件在请求发送给爬虫之前或响应返回给引擎之前可以对它们进行处理。

  1. 下载中间件(Downloader Middleware)

作用: 下载中间件主要负责处理引擎发送到下载器的请求和从下载器返回到引擎的响应。这些中间件在请求发送给下载器之前或响应返回给引擎之前可以对它们进行处理。

  1. 中间件作用优先级

只需要记住,级别越小的越接近scrapy的引擎,结合scrapy的数据流,就能记住每个中间件的作用时机。
在这里插入图片描述

结合图可知:

  • 对于process_request()来说,优先级数字越小越先被调用;
  • 对于process_response()来说,优先级数字越大越先被调用
  • 对于process_spider_input()来说,优先级数字越小越先被调用;
  • 对于process_spider_output()来说,优先级数字越大越先被调用

那么哪来的这些方法?

二、定义中间件的通用模板

  1. 先看一个内置的中间件:UserAgentMiddleware
    在这里插入图片描述
  • init: 在这里进行中间件的初始化,可以使用 settings 对象获取配置信息
  • from_crawler:在这里通过 crawler 对象创建中间件的实例,可以获取全局配置信息
  • spider_opened(可选): 在这里执行爬虫启动时的初始化操作,例如打开文件、连接数据库等
  • process_request(可选): 在这里对请求进行预处理,例如修改请求头、添加代理等
  • 那么同理process_response(可选)
  1. 爬虫中间件模板
class MySpiderMiddleware(object):
    def __init__(self, settings):
        # 在这里进行中间件的初始化,可以使用 settings 对象获取配置信息
        pass

    @classmethod
    def from_crawler(cls, crawler):
        # 在这里通过 crawler 对象创建中间件的实例,可以获取全局配置信息
        settings = crawler.settings
        return cls(settings)

    def process_spider_input(self, response, spider):
        # 在这里处理从下载器传递给爬虫的响应对象
        return response

    def process_spider_output(self, response, result, spider):
        # 在这里处理爬虫生成的结果,例如对结果进行过滤或修改
        return result

    def process_spider_exception(self, response, exception, spider):
        # 在这里处理爬虫产生的异常
        pass

  1. 下载中间件模板
class MyDownloaderMiddleware(object):
    def __init__(self, settings):
        # 在这里进行中间件的初始化,可以使用 settings 对象获取配置信息
        pass

    @classmethod
    def from_crawler(cls, crawler):
        # 在这里通过 crawler 对象创建中间件的实例,可以获取全局配置信息
        settings = crawler.settings
        return cls(settings)

    def process_request(self, request, spider):
        # 在这里对请求进行预处理,例如修改请求头、添加代理等
        return None  # 返回 None 表示继续处理请求,或者返回一个新的请求对象

    def process_response(self, request, response, spider):
        # 在这里对响应进行处理,例如修改响应内容、判断是否重新发送请求等
        return response  # 返回响应对象,或者返回一个新的响应对象

    def process_exception(self, request, exception, spider):
        # 在这里处理请求异常,例如记录日志、发送通知等
        pass

三、位置

在这里插入图片描述

我们自定义的中间件在middlewares.py中编写类就可以


http://www.niftyadmin.cn/n/5234078.html

相关文章

flink源码分析之功能组件(四)-slot管理组件II

简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metrics&…

Basemap地图绘制_Python数据分析与可视化

Basemap地图绘制 安装和使用地图投影地图背景在地图上画数据 Basemap是Matplotlib的一个子包,负责地图绘制。在数据可视化过程中,我们常需要将数据在地图上画出来。 比如说我们在地图上画出城市人口,飞机航线,军事基地&#xff0c…

半监督节点分类上的HyperGCN

1.Title HyperGCN: Hypergraph Convolutional Networks for Semi-Supervised Classification(Naganand Yadati、Prateek Yadav、Madhav Nimishakavi、Anand Louis、Partha Talukdar)【ACM Transactions on Knowledge Discovery from Data 2022】 2.Conc…

【开源存储】minio对象存储部署实践

文章目录 一、前言1、介绍说明2、部署方式3、冗余模式4、约束限制4.1、规格参数4.2、API支持a、minio不支持的Amazon S3 Bucket APIb、minio不支持的Amazon S3 Object API 二、部署说明1、软件安装2、minio单机部署3、minio分布式部署3.1、前置条件3.2、开始运行3.3、操作说明 …

打造个性化github主页 一

文章目录 概述创建仓库静态美化GitHub 统计信息卡仓库 GitHub 额外图钉仓库 热门语言卡仓库 GitHub 资料奖杯仓库 GitHub 活动统计图仓库 打字特效添加中文网站统计仓库 总结 概述 github作为全球最大的代码托管平台,作为程序员都多多少少,都使用过他。…

springboot数据格式验证——自定义日期格式验证及list验证

我们在工作中经常需要对日期格式进行定义,如果客户端传来的日期字符串不符合要求,那么根本无法保存,但是已有的注解并没有日期格式的验证,那我们就自己实现一个 一、自定义日期格式验证的注解DateFormat import javax.validatio…

openGauss学习笔记-137 openGauss 数据库运维-例行维护-检查和清理日志

文章目录 openGauss学习笔记-137 openGauss 数据库运维-例行维护-检查和清理日志137.1 检查操作系统日志137.2 检查openGauss运行日志137.3 清理运行日志 openGauss学习笔记-137 openGauss 数据库运维-例行维护-检查和清理日志 日志是检查系统运行及故障定位的关键手段。建议按…

CGAL的三维曲面细分方法

1、介绍 细分方法是从任意多边形网格生成平滑曲面的简单而强大的方法。与基于样条曲面的方法(如NURBS)或其他基于数字的建模技术不同,细分方法的使用者不需要掌握细分方法的数学知识。几何的直观性足以控制细分方法。 Subdivision_method_3适…