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

Scrapy CrawlSpider导出可被Pandas读取的换行分隔JSON文件问题求助

解决方案:生成换行分隔的域名独立JSON文件

我来帮你解决这个问题!你遇到的核心问题是JsonItemExporter不适合生成你要的换行分隔JSON(JSON Lines),而且它的字节输出逻辑和文本文件模式不兼容。下面是针对性的解决方案:

修改后的pipelines.py代码

from scrapy.exporters import JsonLinesItemExporter

class SaveJsonPipeline:
    def open_spider(self, spider):
        # 初始化文件字典,避免重复打开关闭文件,提升性能
        self.file_handlers = {}

    def process_item(self, item, spider):
        filename = item.pop('filename')  # 移除filename字段,不写入最终JSON
        
        # 如果对应域名的文件还未打开,创建新的导出器并打开文件
        if filename not in self.file_handlers:
            # 用二进制追加模式打开,配合导出器的编码参数处理字符编码
            file = open(filename, 'ab')
            exporter = JsonLinesItemExporter(
                file,
                encoding='utf-8',
                ensure_ascii=False  # 保留非ASCII字符,比如德语特殊字符
            )
            self.file_handlers[filename] = (file, exporter)
        
        # 将当前item导出到对应文件
        _, exporter = self.file_handlers[filename]
        exporter.export_item(item)
        return item

    def close_spider(self, spider):
        # 爬虫结束时统一关闭所有打开的文件,避免资源泄漏
        for file, _ in self.file_handlers.values():
            file.close()

关键改动说明

  1. 替换为JsonLinesItemExporter
    这个导出器是Scrapy专门为JSON Lines格式设计的,会自动将每个item序列化为单独的JSON对象,每行输出一个,完全匹配你想要的易读格式。生成的文件可以直接用Pandas的pd.read_json('domain1.json', lines=True)读取。

  2. 解决字节/文本模式冲突
    用ab二进制追加模式打开文件,配合JsonLinesItemExporter的encoding='utf-8'参数,既符合Scrapy的字节输出逻辑,又能保证文件编码正确,彻底解决之前的TypeError问题。

  3. 优化文件管理

    • 在open_spider中初始化文件字典,避免每次处理item都重复打开/关闭文件,提升爬虫运行效率。
    • 在close_spider中统一关闭所有文件,避免出现资源泄漏的情况。
  4. 额外体验优化
    添加ensure_ascii=False参数,确保导出的JSON保留非ASCII字符(比如stadt-koeln.de页面中的德语特殊字符),不会被转义为Unicode编码,让输出内容更直观。

验证效果

运行爬虫后,生成的JSON文件内容会是如下格式:

{"content": ["The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.", "Albert Einstein"], "scrape_date": 1718000000}
{"content": ["Be yourself; everyone else is already taken.", "Oscar Wilde"], "scrape_date": 1718000001}

这种格式完全符合你的需求,且可以直接被Pandas读取解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:02:44