动态调用Scrapy Spider无法将输出保存至指定文件夹
Scrapy爬虫抓取到Item但JSON文件不生成/文件名异常的解决办法
核心问题分析
你的情况属于Scrapy Feed输出配置在自定义Runner脚本中未被正确加载,或是新旧配置(FEED_URI vs FEEDS)不兼容,以及动态文件名传递方式错误导致的问题。
分步解决方案
1. 改用Scrapy 2.0+推荐的FEEDS配置(替代旧版FEED_URI)
Scrapy 2.0之后官方废弃了FEED_URI、FEED_FORMAT等旧配置,改用FEEDS字典格式,旧配置在通过自定义Runner脚本启动时可能无法被正确解析。
2. 在Runner脚本中直接传递feeds参数(最可靠的方式)
不要依赖Spider类的custom_settings或settings.py中的配置,直接在启动爬虫时传递feeds参数,避免配置加载遗漏:
修改___SPIDER_RUNNER.py代码如下:
from scrapy.crawler import CrawlerProcess from spiders._singlepage_nonAJAX import SinglePageNonAJAXSpider if __name__ == "__main__": # 初始化CrawlerProcess,可添加基础配置 process = CrawlerProcess(settings={ 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', }) # 动态指定输出文件名(从外部传入或自行定义) target_filename = "my_filename_variable" output_path = f'C:/scrapy/JSON_output/{target_filename}.json' # 启动爬虫时直接传入feeds配置 process.crawl( SinglePageNonAJAXSpider, feeds={ output_path: { 'format': 'json', 'encoding': 'utf-8', 'overwrite': True, # 覆盖已有文件,可选 'indent': 4 # 格式化JSON,可选 } } ) process.start()
3. 修复动态文件名传递错误
你之前在Spider类的custom_settings中用f'C:\\scrapy\\JSON_output\\{self.name}.json'是无效的:
custom_settings是类级属性,类定义时self(实例对象)还不存在,无法引用self.name- 从Runner传入的参数是实例参数,无法同步到类级的
custom_settings
正确方式就是上面示例中,在Runner里动态生成路径后传入feeds参数。
4. 排查隐性问题
- 路径解析验证:先写死路径(如
'C:/scrapy/JSON_output/test.json')测试,确认能生成文件后再改动态路径 - 日志检查:在VSCode输出中搜索
feed关键词,查看是否有Feed storage opened或Finished writing feed的日志:- 如果没有这类日志:说明Scrapy未触发Feed写入,检查Runner的配置传递是否正确
- 如果有日志但文件不存在:检查路径是否有拼写错误(比如大小写、转义符),或尝试用正斜杠
/替代反斜杠\
- 权限验证:可以手动在目标文件夹创建一个空文件,确认确实有写入权限;也可以尝试输出到桌面路径测试
5. 排除冲突配置
- 暂时注释
settings.py中的ITEM_PIPELINES配置,避免自定义Pipeline拦截Item导致无法写入Feed - 确保
settings.py中没有设置FEED_STORAGE(默认是scrapy.extensions.feedexport.FileSystemStorage,无需修改)
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

