先导入
from scrapy.exporters import JsonItemExporter, JsonLinesItemExporter
大致概括下:
(要用二进制的方式来写)
首先我们从名字里大致可以看出来了,两者区别 Lines 也就是行的意思
也就是说 前者是一起写进json文件里,后者是我们每次parse函数yield的item,经过处理就直接写入json里面,
那么我们可以想一下,前者,既然是一起写入,假如我们爬取的的数据有上万条,那就很吃内存了,
后者是一条一条的存,对内存很友好,但是他每次写入的是一个 dict,可能读取的时候,没有 前者友好。
1.代码
前者
from scrapy.exporters import JsonItemExporter, JsonLinesItemExporter
class TestPipeline(object):
def __init__(self):
self.fp = open("data.json", 'wb')
self.exporter = JsonItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')
self.exporter.start_exporting()
def open_spider(self, spider):
pass
def process_item(self, item, spider):
self.exporter.export_item(item)
return item
def close_spider(self, spider):
self.exporter.finish_exporting()
self.fp.close()
需要注意 我们在开始爬虫的时候,要 start_exporting,结束的时候 finish_exporting
我们看下源码,
def start_exporting(self):
self.file.write(b"[")
self._beautify_newline()
def finish_exporting(self):
self._beautify_newline()
self.file.write(b"]")
所以我们说的 后者读数据不友好的问题就不存在了。
后者
from scrapy.exporters import JsonItemExporter, JsonLinesItemExporter
class TwoonespiderPipeline(object):
def __init__(self):
self.fp = open("duanzi.json", 'wb')
self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')
self.fp.write(b"[")
def open_spider(self, spider):
pass
def process_item(self, item, spider):
self.exporter.export_item(item)
self.fp.write(b',')
return item
def close_spider(self, spider):
self.fp.write(b"]")
self.fp.close()