如何将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
相关产品推荐
相关产品推荐

