Scrapy使用CrawlerProcess启动Splash爬虫时代理不生效问题
问题原因
- 核心原因是
CrawlerProcess默认不会自动读取项目根目录下的settings.py配置,而scrapy crawl命令执行时会自动加载项目的全量配置,包括你配置的scrapy-splash相关中间件、去重规则等。你直接实例化空的CrawlerProcess(),scrapy-splash的组件没有被加载,写在lua脚本里的代理规则和SplashRequest里的proxy参数自然不会生效。 - 次要问题是你当前的代理配置冗余,同时在lua脚本的
request:set_proxy和SplashRequest的args里传了proxy参数,可能产生优先级冲突。
解决方法
方法1:实例化CrawlerProcess时传入项目配置
导入官方提供的配置加载工具加载项目配置,和scrapy crawl启动效果完全一致:
from scrapy.crawler import CrawlerProcess # 导入scrapy自带的项目配置加载工具 from scrapy.utils.project import get_project_settings # 加载当前项目的settings.py全量配置 settings = get_project_settings() process = CrawlerProcess(settings) process.crawl(AdsSpiderSpider2) process.start()
方法2:手动传入必要配置
如果不需要加载整个项目的settings,也可以手动把scrapy-splash相关配置传入:
from scrapy.crawler import CrawlerProcess process = CrawlerProcess(settings={ 'ROBOTSTXT_OBEY': False, 'DOWNLOAD_DELAY': 0.5, 'RANDOMIZE_DOWNLOAD_DELAY': True, 'DOWNLOADER_MIDDLEWARES': { 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, }, 'SPLASH_URL': 'http://localhost:8050', 'SPIDER_MIDDLEWARES': { 'scrapy_splash.SplashDeduplicateArgsMiddleware': 100, }, 'DUPEFILTER_CLASS': 'scrapy_splash.SplashAwareDupeFilter' }) process.crawl(AdsSpiderSpider2) process.start()
额外优化建议
冗余的代理配置保留任意一处即可:
- 保留lua脚本里的
request:set_proxy配置,就删掉SplashRequest的args里的proxy参数 - 或者删除lua里的set_proxy逻辑,只保留SplashRequest里的proxy参数
内容的提问来源于stack exchange,提问作者Szymon
相关产品推荐
相关产品推荐

