Scrapy 数据保存到json

Scrapy 数据保存到json

创建json保存的pipeline

pipeline处理

import codecs

这个包可以处理好编码,避免各种编码繁杂工作。

新建pipeline,构造函数 codecs打开文件,用’w’的方式。

class JsonWithEncodingPipeline(object):
    def __init__(self):
        self.file = codecs.open('article.json', 'w', encoding="utf-8")

第二,像下面的方式一样处理pipeline。

class ArticlespiderPipeline(object):
    def process_item(self, item, spider):

item不是dict,但是�可以用dict(item)转化成dict。因为直接json.dumps(item)是不行的,所以要用dict()转化。

    def process_item(self, item, spider):
        lines = json.dumps(dict(item), ensure_ascii=False, )

其中ensure_ascii=False一定要False,否则导入中文会不正常。

写入文件并返回item。

    def process_item(self, item, spider):
        lines = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(lines)
        return item

关闭爬虫时,关闭文件。

    def spider_closed(self, spider):
        self.file.close()

配置pipeline

ITEM_PIPELINES = {
    'ArticleSpider.pipelines.ArticleImagePipeline': 1,
    'ArticleSpider.pipelines.JsonWithEncodingPipeline':2,
}

Scrapy自带写入json

在pipeline中,

from scrapy.exporters import JsonItemExporter

进入函数,最上面可以看见有多种格式的导出方式。

wb二进制方式打开。

class JsonExporterPipeline(object):
    # 调用Scrapy提供的JsonExporter导出Json文件。
    def __init__(self):
        self.file = open('article_exporter.json', 'wb')
        self.exporter = JsonItemExporter(self.file, encoding="utf-8", ensure_ascii=False)
        self.exporter.start_exporting()

    def close_spider(self, spider):
        self.exporter.finish_exporting()
        self.file.close()

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item

json中前后都有括号,是因为exporter.py中前后都加了括号。

    def start_exporting(self):
        self.file.write(b"[\n")

    def finish_exporting(self):
        self.file.write(b"\n]")
    原文作者:Tim_Lee
    原文地址: https://www.jianshu.com/p/e264d835474c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞