You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

独立Scrapy脚本中自定义下载中间件配置报错问题

独立Scrapy脚本中配置自定义下载中间件的可行方案

完全可以实现!你遇到的报错是因为Scrapy在独立脚本环境下,对中间件路径的解析逻辑和标准Scrapy项目不同。下面是针对你的场景的最优实现步骤和代码示例:

核心问题分析

你之前的两种配置方式都踩了独立脚本的坑:

  • 用'update.CustomMiddleware':400时,直接运行python update.py的情况下,当前脚本的模块名是__main__而非update,所以Scrapy找不到名为update的模块。
  • 直接写CustomMiddleware时,Scrapy要求中间件配置必须是字符串格式的模块路径,而不是类对象本身,因此报错路径无效。

最优实现方式

在同一个update.py文件中定义中间件,然后在配置中使用__main__.CustomMiddleware作为中间件的路径(对应独立运行时的模块名)。以下是完整的可运行示例:

import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.settings import Settings

# 1. 定义自定义下载中间件
class CustomMiddleware:
    def process_request(self, request, spider):
        # 这里写你的中间件逻辑,比如修改请求头、添加代理等
        spider.logger.info("Custom middleware processing request...")
        request.headers["User-Agent"] = "MyCustomScraper/1.0"
        return None

    # 可选:实现process_response或process_exception方法
    def process_response(self, request, response, spider):
        spider.logger.info(f"Received response from {request.url}")
        return response

def main():
    # 2. 构建独立运行所需的配置
    # 方式一:完全自定义设置(推荐,避免依赖项目配置)
    settings = Settings({
        "DOWNLOADER_MIDDLEWARES": {
            # 用__main__指代当前运行的模块
            "__main__.CustomMiddleware": 400,
            # 可选:禁用不需要的默认中间件,比如默认的UserAgentMiddleware
            # "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None,
        },
        "ROBOTSTXT_OBEY": False,  # 根据需求调整
        "LOG_LEVEL": "INFO"       # 控制日志输出级别
    })

    # 方式二:基于默认项目设置修改(如果需要复用部分默认配置)
    # from scrapy.utils.project import get_project_settings
    # settings = get_project_settings()
    # settings.set("DOWNLOADER_MIDDLEWARES", {
    #     "__main__.CustomMiddleware": 400,
    # })

    # 3. 定义你的爬虫类
    class MySpider(scrapy.Spider):
        name = "example_spider"
        start_urls = ["https://example.com"]

        def parse(self, response):
            self.logger.info(f"Successfully crawled {response.url}")
            # 这里写你的解析逻辑

    # 4. 启动爬虫
    process = CrawlerProcess(settings)
    process.crawl(MySpider)
    process.start()

if __name__ == "__main__":
    main()

关键注意事项

  • 中间件优先级:数字越小,中间件越先执行。400的优先级比默认的UserAgentMiddleware(优先级500)高,所以你的自定义逻辑会先触发。
  • 中间件方法:至少要实现process_request、process_response或process_exception中的一个,否则Scrapy不会正确加载该中间件。
  • 脚本独立性:这个方案不需要任何额外文件或Scrapy项目结构,直接运行python update.py即可启动爬虫。

内容的提问来源于stack exchange,提问作者Calimocho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:58:12