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

如何将Scrapy抓取的不同类型条目保存至多个.jl文件?

实现Scrapy不同类型Item保存到单独JSON Lines文件的方案

嘿,我来帮你搞定这个需求!要把不同类型的Scrapy Item分别存到单独的JSON Lines文件里,其实只需要修改你的Pipeline类,让它们各自负责对应的Item类型,并且处理文件的读写逻辑就行。下面是一步步的具体实现:

1. 确保Items类定义完整

首先先把items.py里的两个Item类补全(假设你还有其他字段,这里示例基础结构):

import scrapy

class PermitType(scrapy.Item):
    permitWebCode = scrapy.Field()
    # 这里添加你的其他字段,比如permit_name、permit_category等

class PermitNumber(scrapy.Item):
    permitNumber = scrapy.Field()
    # 同样添加你的其他相关字段,比如apply_date、status等

2. 修改Pipeline类,添加文件读写逻辑

在pipelines.py里,我们需要给每个Pipeline类添加爬虫启动时打开文件、爬虫关闭时关闭文件、处理Item时写入对应文件的逻辑,同时只处理对应的Item类型:

import json
from permits.items import PermitType, PermitNumber  # 必须导入你的Item类

class PermitTypePipeline(object):
    def open_spider(self, spider):
        # 爬虫启动时打开permit_types.jl文件,'w'表示覆盖写入,要追加的话改成'a'
        self.file = open('permit_types.jl', 'w', encoding='utf-8')

    def close_spider(self, spider):
        # 爬虫结束时关闭文件
        self.file.close()

    def process_item(self, item, spider):
        # 只处理PermitType类型的Item
        if isinstance(item, PermitType):
            # 把Item转成字典,再序列化为JSON字符串,加上换行符符合JSON Lines格式
            line = json.dumps(dict(item), ensure_ascii=False) + '\n'
            self.file.write(line)
        # 记得返回Item,后续Pipeline(如果有的话)还能处理
        return item

class PermitNumberPipeline(object):
    def open_spider(self, spider):
        self.file = open('permit_numbers.jl', 'w', encoding='utf-8')

    def close_spider(self, spider):
        self.file.close()

    def process_item(self, item, spider):
        if isinstance(item, PermitNumber):
            line = json.dumps(dict(item), ensure_ascii=False) + '\n'
            self.file.write(line)
        return item

3. 验证Settings配置

你的settings.py里的ITEM_PIPELINES配置已经正确启用了这两个Pipeline,不需要修改:

ITEM_PIPELINES = {
    'permits.pipelines.PermitTypePipeline': 300,
    'permits.pipelines.PermitNumberPipeline': 301,
}

这里的数字是优先级,因为两个Pipeline各自处理不同的Item,顺序影响不大。

4. 测试运行

现在启动你的Scrapy爬虫,爬取完成后,你会在项目根目录下看到两个文件:

  • permit_types.jl:存放所有PermitType类型的条目
  • permit_numbers.jl:存放所有PermitNumber类型的条目

额外注意点

  • 如果想指定文件的绝对路径,比如存在data文件夹下,可以写成open('./data/permit_types.jl', 'w', encoding='utf-8'),记得先创建data文件夹,否则会报错
  • ensure_ascii=False是为了保证中文等非ASCII字符能正常显示,避免被转成Unicode编码
  • 如果需要在写入时处理异常,可以在process_item里添加try-except块,比如捕获IO错误,避免爬虫意外终止

内容的提问来源于stack exchange,提问作者Username

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:50:07