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()
关键改动说明
替换为
JsonLinesItemExporter
这个导出器是Scrapy专门为JSON Lines格式设计的,会自动将每个item序列化为单独的JSON对象,每行输出一个,完全匹配你想要的易读格式。生成的文件可以直接用Pandas的pd.read_json('domain1.json', lines=True)读取。解决字节/文本模式冲突
用ab二进制追加模式打开文件,配合JsonLinesItemExporter的encoding='utf-8'参数,既符合Scrapy的字节输出逻辑,又能保证文件编码正确,彻底解决之前的TypeError问题。优化文件管理
- 在
open_spider中初始化文件字典,避免每次处理item都重复打开/关闭文件,提升爬虫运行效率。 - 在
close_spider中统一关闭所有文件,避免出现资源泄漏的情况。
- 在
额外体验优化
添加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
相关产品推荐
相关产品推荐

