Scrapy输出JSON中文乱码

If you’re not statisfied with the life you’re living, don’t just complain. Do something about it. ——《三十而已》

对于现状的不满, 你不能只是抱怨, 而是要有勇气做出改变。

发现问题

在使用下面的命令运行scrapy使其输出json格式时,出现了中文乱码问题, 如下图:

1
scrapy crawl spidername -o test.json

解决问题

方法一

运行爬虫时指定编码格式, 即在命令后面增加 -s FEED_EXPORT_ENCODING=utf-8。如下:

1
scrapy crawl spidername -o test.json -s FEED_EXPORT_ENCODING=utf-8

方法二

方法一虽然可以解决问题,但并没有一劳永逸,每次运行爬虫都需要指定编码格式。所以我们直接在 settings 中指定编码格式。在合适的位置加入下面一行即可。

1
FEED_EXPORT_ENCODING = 'utf-8'

方法三

自定义Pipeline,并在settings中开启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class JsonPipeline(object):
def __init__(self):
self.f = codecs.open('test.json', 'w', encoding='utf-8')
self.f.write('[')

def process_item(self, item, spider):
content = json.dumps(item, ensure_ascii=False) + ',\n'
self.f.write(content)
return item

def close_spider(self, spider):
self.f.write(']')
self.f.close()

settings中找到ITEM_PIPELINES,修改成如下格式

1
2
3
ITEM_PIPELINES = {
'xxx.pipelines.JsonPipeline': 300,
}

自定义Pipeline之后,就不用使用 -o 指定文件了。如下:

1
scrapy crawl spidername