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

如何通过API(Postman)修改Scrapy+Scrapyd的爬虫配置参数?

解决Scrapyd传递Scrapy核心配置不生效的问题

核心思路

Scrapyd传递的配置需要在爬虫运行时动态加载,而非依赖部署阶段的custom_settings类属性。通过爬虫的__init__方法操作crawler.settings,可以覆盖默认配置,同时避免部署时的KeyError。

具体实现步骤

  1. Scrapyd API传递配置的正确方式
    调用Scrapyd的schedule.json接口时,将需要修改的Scrapy配置放在settings字段中(支持JSON格式)。比如Postman的请求Body:

    {
        "project": "your_project",
        "spider": "target_spider",
        "start_urls": "https://example.com,https://test.org",
        "settings": {
            "CONCURRENT_REQUESTS": 5,
            "DOWNLOAD_DELAY": 2,
            "ROBOTSTXT_OBEY": false
        }
    }
    
  2. 在爬虫__init__方法中动态加载配置
    利用爬虫初始化时的self.crawler.settings对象,覆盖默认配置,同时限制最多10个允许修改的配置:

    import scrapy
    
    class TargetSpider(scrapy.Spider):
        name = "target_spider"
        start_urls = []
        # 定义允许通过API修改的10个核心配置
        ALLOWED_SETTINGS = [
            'CONCURRENT_REQUESTS',
            'DOWNLOAD_DELAY',
            'CONCURRENT_REQUESTS_PER_DOMAIN',
            'CONCURRENT_REQUESTS_PER_IP',
            'DOWNLOAD_TIMEOUT',
            'USER_AGENT',
            'ROBOTSTXT_OBEY',
            'COOKIES_ENABLED',
            'AUTOTHROTTLE_ENABLED',
            'AUTOTHROTTLE_TARGET_CONCURRENCY'
        ]
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            # 处理start_urls(原逻辑保留)
            if 'start_urls' in kwargs:
                self.start_urls = kwargs['start_urls'].split(',')
            
            # 动态加载并覆盖Scrapy配置
            for setting_name in self.ALLOWED_SETTINGS:
                setting_value = self.crawler.settings.get(setting_name)
                if setting_value is not None:
                    # 根据配置类型转换值,确保格式正确
                    if setting_name in ['CONCURRENT_REQUESTS', 'CONCURRENT_REQUESTS_PER_DOMAIN', 'CONCURRENT_REQUESTS_PER_IP', 'DOWNLOAD_TIMEOUT']:
                        setting_value = int(setting_value)
                    elif setting_name in ['DOWNLOAD_DELAY', 'AUTOTHROTTLE_TARGET_CONCURRENCY']:
                        setting_value = float(setting_value)
                    elif setting_name in ['ROBOTSTXT_OBEY', 'COOKIES_ENABLED', 'AUTOTHROTTLE_ENABLED']:
                        setting_value = bool(setting_value)
                    # 设置配置优先级为cmdline,确保覆盖默认值
                    self.crawler.settings.set(setting_name, setting_value, priority='cmdline')
    
  3. 关键细节说明

    • 使用priority='cmdline':Scrapy配置优先级中,命令行/API传递的参数优先级高于默认配置和custom_settings,确保传递的配置生效。
    • 避免custom_settings引用API参数:custom_settings是类属性,部署阶段(scrapyd-deploy)就会被解析,此时API参数尚未传递,必然触发KeyError。
    • 配置类型转换:部分Scrapy配置需要特定类型(比如整数、布尔值),直接传递字符串会导致配置失效,所以需要做类型转换。

验证方法

部署爬虫后,通过Postman发送包含settings字段的请求,爬虫运行时可以通过self.crawler.settings.get(setting_name)检查配置是否生效,或者查看Scrapyd的日志确认配置已被应用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:52:56