Scrapy pipelines中的JsonItemExporter和JsonLinesItemExporter的区别(1ni)

先导入

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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值