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]")