如何通过API(Postman)修改Scrapy+Scrapyd的爬虫配置参数?
解决Scrapyd传递Scrapy核心配置不生效的问题
核心思路
Scrapyd传递的配置需要在爬虫运行时动态加载,而非依赖部署阶段的custom_settings类属性。通过爬虫的__init__方法操作crawler.settings,可以覆盖默认配置,同时避免部署时的KeyError。
具体实现步骤
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 } }在爬虫
__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')关键细节说明
- 使用
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
相关产品推荐
相关产品推荐

