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

Scrapy通过Scrapyd启动时无法在指定路径生成JSON文件

问题原因分析

直接用closest_scrapy_cfg()获取项目根目录在Scrapyd环境下会失效——Scrapyd运行爬虫时的工作目录并非你的Scrapy项目根目录,而closest_scrapy_cfg()是从当前工作目录向上递归查找scrapy.cfg文件,自然找不到正确路径,导致后续生成的文件位置不符合预期。另外代码中硬编码\\作为路径分隔符,跨平台兼容性差,也容易引发路径拼接错误。

解决方案

方案1:用Scrapy Feed Exports功能(推荐)

放弃手动写文件的方式,改用Scrapy官方提供的Feed Exports,这是最可靠的实现方式,本地和Scrapyd环境下都能稳定工作。

操作步骤:

  1. 在项目settings.py中添加Feed配置:
# settings.py
FEEDS = {
    'files/info/entries.json': {
        'format': 'jsonlines',  # 和你之前手动写入的格式一致:每行一个JSON对象
        'encoding': 'utf-8',
        'overwrite': False,  # 对应原代码的追加模式'a',需要覆盖则设为True
    }
}
  1. 简化爬虫代码,删除手动操作文件的逻辑:
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配置项获取项目根目录,避免依赖运行时的工作目录:

  1. 在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')
  1. 修改爬虫的路径获取代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:21:14