Scrapy通过Scrapyd启动时无法在指定路径生成JSON文件
问题原因分析
直接用closest_scrapy_cfg()获取项目根目录在Scrapyd环境下会失效——Scrapyd运行爬虫时的工作目录并非你的Scrapy项目根目录,而closest_scrapy_cfg()是从当前工作目录向上递归查找scrapy.cfg文件,自然找不到正确路径,导致后续生成的文件位置不符合预期。另外代码中硬编码\\作为路径分隔符,跨平台兼容性差,也容易引发路径拼接错误。
解决方案
方案1:用Scrapy Feed Exports功能(推荐)
放弃手动写文件的方式,改用Scrapy官方提供的Feed Exports,这是最可靠的实现方式,本地和Scrapyd环境下都能稳定工作。
操作步骤:
- 在项目
settings.py中添加Feed配置:
# settings.py FEEDS = { 'files/info/entries.json': { 'format': 'jsonlines', # 和你之前手动写入的格式一致:每行一个JSON对象 'encoding': 'utf-8', 'overwrite': False, # 对应原代码的追加模式'a',需要覆盖则设为True } }
- 简化爬虫代码,删除手动操作文件的逻辑:
import math from typing import Any import scrapy from scrapy.http import Response class NsidcInfoSpider(scrapy.Spider): name = 'nsidc_info' # 补充爬虫名称,原代码缺失 def __init__(self, start_urls=None, *args, **kwargs): super(NsidcInfoSpider, self).__init__(*args, **kwargs) self.namespaces = { ... # 保留你的命名空间配置 } def parse(self, response): # 保留你的解析逻辑,生成目标对象 obj = {} # 直接yield对象,Feed会自动写入配置好的文件 yield obj
方案2:修正路径获取逻辑(兼容手动写文件场景)
如果必须手动处理文件写入,改用Scrapy配置项获取项目根目录,避免依赖运行时的工作目录:
- 在
settings.py中添加路径配置:
# settings.py import os PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) FILE_STORE_DIR = os.path.join(PROJECT_ROOT, 'files', 'info')
- 修改爬虫的路径获取代码:
import math from typing import Any import scrapy from scrapy.http import Response import json import os from scrapy.utils.project import get_project_settings class NsidcInfoSpider(scrapy.Spider): name = 'nsidc_info' def __init__(self, start_urls=None, *args, **kwargs): super(NsidcInfoSpider, self).__init__(*args, **kwargs) self.namespaces = { ... } # 从配置中获取存储目录 settings = get_project_settings() self.store_dir = settings.get('FILE_STORE_DIR') if not os.path.exists(self.store_dir): os.makedirs(self.store_dir) self.file_path = os.path.join(self.store_dir, 'entries.json') self.file = open(self.file_path, 'a') def parse(self, response): obj = {} # 保留你的解析逻辑 json_string = json.dumps(obj) self.file.write(json_string + '\n') def closed(self, reason): self.file.close()
额外注意事项
- 用Scrapyd部署时,确保同步最新的
settings.py配置文件。 - 检查Scrapyd运行用户是否有目标目录的读写权限,权限不足也会导致文件无法生成。
内容的提问来源于stack exchange,提问作者Dodge_X
相关产品推荐
相关产品推荐

