Python Scrapy下载中间件的编写与配置详解

小林子
小林子
发布时间:2026-10-15| 3人浏览过
原创

本文详解Scrapy框架中下载中间件的编写方法。涵盖process_request、process_response及process_exception三大核心函数的实现逻辑,演示如何通过中间件进行UA伪装、响应数据篡改(结合Selenium处理动态加载)以及代理IP设置,并说明在settings.py中启用中间件的具体配置步骤。

下载中间件

在每个Scrapy项目中,默认存在一个名为 middlewares.py 的文件,专门用于存放中间件代码。其中,下载中间件的类通常命名为 XxxDownloaderMiddleware(Xxx为项目名),该类主要包含以下三个核心方法。

def process_request(self, request, spider):
return None
def process_response(self, request, response, spider):
return response
def process_exception(self, request, exception, spider):
pass

process_request

该方法用于拦截发出的请求。开发者可在此处实现User-Agent(UA)伪装,例如从自定义的UA池中随机选取一个头部信息附加到请求中。需要注意的是,UA池的具体实现需由开发者自行编写。

def process_request(self, request, spider):
        # UA伪装,从UA池随机一个
        request.headers['User-Agent'] = random.choice(self.user_agent_list)
        return None

process_response

该方法用于拦截服务器返回的响应。在此处可以对响应数据进行修改或篡改。若需获取动态加载的数据,可将Selenium与Scrapy结合使用:在中间件中调用Selenium浏览器对象获取页面源码,并构造新的HtmlResponse对象返回,从而替代原始响应。

 def process_response(self, request, response, spider):
        # 浏览器对象
        bro = spider.bro
        # 参数spider是爬虫对象
        # 挑选出指定响应对象进行篡改url->request->response
        bro.get(request.url)
        page_text = bro.page_source  # 包含了动态加载的数据
        # 针对定位到的response篡改
        # 实例化新的响应对象(包含动态加载的数据)
        response = HtmlResponse(url=bro.current_url, body=page_text, encoding='utf-8', request=request)
        return response

在爬虫文件(Spider)中,需预先实例化Selenium的浏览器对象,并将其作为爬虫对象的属性,以便在中间件中调用。

import scrapy
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver import ChromeOptions

class XxxSpider(scrapy.Spider):
    name = 'xxx'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['……']
    def __init__(self):
        service = Service('/Users/soutsukyou/PyCharm_Workspace/网络爬虫/study_selenium/chromedriver')
        chrome_options = ChromeOptions()
        # 规避检测
        chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
        # 实例化浏览器
        self.bro = webdriver.Chrome(service=service, options=chrome_options)

process_exception

该方法用于拦截发生异常的请求。通常在此处配置代理IP池,根据请求协议(http或https)从对应的代理池中随机选取IP并设置到request.meta中,随后返回request以触发重新请求。两个代理IP池的具体实现需由开发者自行编写。

 def process_exception(self, request, exception, spider):
        # 可以设置代理ip
        if request.url.split(':')[0] == 'http':
            request.meta['proxy'] = 'http://'+random.choice(self.PROXY_http)
        if request.url.split(':')[0] == 'https':
            request.meta['proxy'] = 'https://'+random.choice(self.PROXY_https)
        # 重新请求发送
        return request

其它

编写完成后,必须在项目的 settings.py 文件中配置 DOWNLOADER_MIDDLEWARES 字典,启用对应的中间件类并指定优先级,配置方可生效。

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
   'xxx.middlewares.XxxDownloaderMiddleware': 543,
}

以上介绍了Python爬虫框架Scrapy中下载中间件的编写与配置方法。如需了解更多Scrapy中间件相关内容,可参考本站其他文章或继续浏览后续章节,感谢支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。