详解scrapy内置中间件的顺序

Scrapy是一个功能强大的Python爬虫框架,它的中间件可以在爬虫运行的不同阶段进行拦截和调整请求和响应。Scrapy内置了一些中间件,这些中间件的顺序是固定的,对于新手来说,这可能会导致一些困惑和难以解决的问题。下面我将详细讲解"详解scrapy内置中间件的顺序",以及在某种情况下如何更改中间件的顺序。

Scrapy内置中间件的顺序

Scrapy内置的中间件按照以下顺序执行:

  1. Downloader Middleware:

  2. HttpCompressionMiddleware

  3. RobotsTxtMiddleware
  4. HttpAuthMiddleware
  5. DownloadTimeoutMiddleware
  6. UserAgentMiddleware
  7. RetryMiddleware
  8. RedirectMiddleware
  9. CookiesMiddleware
  10. HttpProxyMiddleware
  11. HttpErrorMiddleware
  12. RefererMiddleware
  13. MetaRefreshMiddleware
  14. HttpCompressionMiddleware

  15. Spider Middleware:

  16. DepthMiddleware

上面列举的是Scrapy框架内置中间件的顺序。其中,Downloader Middleware用于在下载器执行请求前后进行处理,Spider Middleware用于在Spider执行前后进行处理。如果想了解每个中间件的具体作用和顺序,可以参考Scrapy官方文档。

如何修改Scrapy中内置中间件的顺序

在某些情况下,我们可能需要更改Scrapy内置中间件的顺序。例如,如果我们需要在下载前设置请求头部,但是该请求头部依赖于前一个响应中的一些信息,我们需要将UserAgentMiddleware放在更前面,这样才能保证请求头在发送前被正确设置。

下面是如何在Scrapy中修改中间件的顺序:

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomHttpCompressionMiddleware': 550,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
    'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 600,
    'myproject.middlewares.CustomHttpAuthMiddleware': 610,
    'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 620,
    'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 650,
    'myproject.middlewares.CustomUserAgentMiddleware': 550,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
    'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
    'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
    'scrapy.downloadermiddlewares.httperror.HttpErrorMiddleware': 800,
    'myproject.middlewares.CustomRefererMiddleware': 820,
    'scrapy.downloadermiddlewares.referer.RefererMiddleware': 840,
    'scrapy.downloadermiddlewares.metarefresh.MetaRefreshMiddleware': 900,
}

SPIDER_MIDDLEWARES = {
    'myproject.middlewares.CustomDepthMiddleware': 900,
    'scrapy.spidermiddlewares.depth.DepthMiddleware': 800,
}

上面的代码展示了如何修改Downloader Middleware和Spider Middleware的顺序。修改的方法是:将需要修改顺序的中间件的名称和优先级加入到项目的配置文件中。

例如,要将CustomUserAgentMiddleware放在UserAgentMiddleware之前,可以修改为:

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomHttpCompressionMiddleware': 550,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
    'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 600,
    'myproject.middlewares.CustomHttpAuthMiddleware': 610,
    'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 620,
    'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 650,
    'myproject.middlewares.CustomUserAgentMiddleware': 400,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
    'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
    'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
    'scrapy.downloadermiddlewares.httperror.HttpErrorMiddleware': 800,
    'myproject.middlewares.CustomRefererMiddleware': 820,
    'scrapy.downloadermiddlewares.referer.RefererMiddleware': 840,
    'scrapy.downloadermiddlewares.metarefresh.MetaRefreshMiddleware': 900,
}

在上面的配置中,将CustomUserAgentMiddleware的优先级设置为400,这样就会在UserAgentMiddleware之前执行CustomUserAgentMiddleware。

示例说明

示例一:

一个常见需求是请求头设置。我们通常会使用scrapy.downloadermiddlewares.useragent.UserAgentMiddleware来设置请求头中的User-Agent字段。但是,有些网站需要在请求头中包含其他信息,例如Cookie、Referer等。这时候我们需要自定义中间件,把User-Agent和Cookie、Referer等头部信息一起设置。具体可以参考以下代码:

class CustomHeadersMiddleware(object):
    def process_request(self, request, spider):
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
            'Referer': 'https://www.google.com/',
            'Cookie': 'sessionid=123456789'
        }
        request.headers.update(headers)
        return None

其中,process_request(self, request, spider)方法会在请求被发送前自动执行,将headers中定义的键值对设置进request对象对应的headers中。

在使用自定义的请求头时,我们需要将自定义的中间件放在scrapy.downloadermiddlewares.useragent.UserAgentMiddleware之前,以保证请求头的正确配置顺序。在settings.py文件中添加如下设置:

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomHeadersMiddleware': 400,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 401,
}

示例二:

有些网站限制了请求的访问速度和频率,为此,我们需要在爬虫中添加延时设置。Scrapy中内置了scrapy.downloadermiddlewares.retry.RetryMiddleware中间件来设置请求超时重试。但是,它只会重试请求,不会添加任何延迟、等待时间的处理。所以,我们需要自定义一个中间件来添加延迟、等待时间的逻辑。具体可以参考以下代码:

import random

class CustomThrottleMiddleware(object):
    def __init__(self, delay):
        self.delay = delay

    @classmethod
    def from_crawler(cls, crawler):
        delay = crawler.settings.getint('DOWNLOAD_DELAY')
        return cls(delay)

    def process_request(self, request, spider):
        delay = random.uniform(0, self.delay)
        spider.logger.info("Delaying request for %.2f seconds..." % delay)
        time.sleep(delay)

这个中间件可以将请求延时(delay)时间之后再执行。在使用自定义的延时设置中间件时,需要将自定义的中间件放在下载中间件链的最前面,以最先执行。在settings.py文件中添加如下设置:

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomThrottleMiddleware': 150,
}

这里的"150"是自定义的下载中间件优先级,值越小优先级越高。若中间件中有多个,按照从上往下执行的顺序。我们使用自定义的延时设置中间件时,将其设置为比其他下载中间件更优先,以最先执行延时逻辑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解scrapy内置中间件的顺序 - Python技术站

(0)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • Python实现SQL注入检测插件实例代码

    在本攻略中,我们将介绍如何使用Python实现SQL注入检测插件。以下是一个完整攻略,包括两个示例。 步骤1:分析SQL注入 首先,需要了解SQL注入的原理和检测方法。SQL注入是一种常见的Web攻击方式,攻击者通过在Web应用程序中注入恶意的SQL代码,从而获取敏感信息或者控制数据库。检测SQL注入的方法包括手工检测和自动检测。手工检测需要对Web应用程序…

    python 2023年5月15日
    00
  • python3下载抖音视频的完整代码

    以下是关于“python3下载抖音视频的完整代码”的完整攻略: 什么是抖音视频 抖音是一款基于短视频分享的社交软件,视频时长一般在15秒左右,也有部分视频长度超过60秒。抖音视频涉及到视频特效、音乐、视频拍摄等多个方面,也受到了一定的用户追捧。 使用Python3下载抖音视频的完整代码 为了方便更多人下载抖音视频,我们可以编写Python3代码来实现批量下载…

    python 2023年6月3日
    00
  • python 判断文件还是文件夹的简单实例

    下面是完整攻略: 判断文件和文件夹的简单实例 在Python中,使用os模块可以方便地判断一个路径是文件还是文件夹。常用的函数有os.path.isfile()和os.path.isdir()。 isfile()函数 判断一个路径是否为文件,可以使用os.path.isfile()函数。示例代码如下: import os # 判断文件是否存在 file_pa…

    python 2023年6月2日
    00
  • 在 python 中生成特定的排列模式

    【问题标题】:Generating specific permutation patterns in python在 python 中生成特定的排列模式 【发布时间】:2023-04-01 17:51:01 【问题描述】: 我正在尝试对概率系统进行建模。我正在使用的系统涉及三个元素——称它们为“X”、“Y”和“Z”。这些元素以特定类型的交替模式形成字符串,其…

    Python开发 2023年4月8日
    00
  • python实现的用于搜索文件并进行内容替换的类实例

    要实现搜索文件并进行内容替换的功能,可以使用Python中的os模块和re模块。 首先,需要定义一个用于进行搜索文件并替换内容的类。下面是一个示例: import os import re class FileSearchAndReplace: def __init__(self, search_dir, search_regex, replace_rege…

    python 2023年6月3日
    00
  • Python实现决策树C4.5算法的示例

    Python实现决策树C4.5算法的示例 什么是决策树C4.5算法? 决策树C4.5算法是一种常用的分类算法,它的基思通过对数据集进行划分,构建一棵树形结构,从而实现对数据的分类。C4.5算法是ID3算法改进版,它在ID3算法的基础上引入了信息增益比的概念,解决了ID3算法中存在的一些问题。 决策树C4.5算法的实现步骤 决策树C4.5算法的实现步骤如下: …

    python 2023年5月14日
    00
  • python中reduce()函数的使用方法示例

    下面是Python中reduce()函数的使用方法示例攻略: 什么是reduce()函数? reduce()函数是Python内置的高阶函数,其作用是将一个函数作用在一个序列上,这个函数必须接收两个参数,reduce()依次将序列中的元素和上一次的调用结果传递给这个函数,最终得到一个结果。 reduce()函数的基本语法 reduce(function, i…

    python 2023年6月5日
    00
  • Python 流媒体播放器的实现(基于VLC)

    下面我将为您详细讲解“Python 流媒体播放器的实现(基于VLC)”的完整攻略。 一、背景介绍 在Python程序中,我们有时需要集成流媒体播放器的功能,让用户可以直接在应用程序内部播放媒体文件。本攻略将基于VLC库实现Python中的流媒体播放器。 二、实现步骤 1. 安装VLC 在开始之前,我们需要先安装VLC,安装过程请参考VLC官方文档。 2. 安…

    python 2023年6月13日
    00
合作推广
合作推广
分享本页
返回顶部