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

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

本文详解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 相关产品和应用

全部下载

专题列表