scrapy将爬取的中文内容保存到json文件中

时间:2023-02-02 10:59:35

1. 修改settings.py,启用item pipelines组件


# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
# ITEM_PIPELINES = {
#    'tutorial.pipelines.TutorialPipeline': 300,
# }

改为

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'tutorial.pipelines.TutorialPipeline': 300,
}

当然,我们不能只改而不去研究其中的意义.

根据官方注释我们顺利找到了官方文档对此的解释说明:

为了启用一个Item Pipeline组件,你必须将它的类添加到 ITEM_PIPELINES 配置,就像下面这个例子:

ITEM_PIPELINES = { 
'myproject.pipelines.PricePipeline': 300, 
'myproject.pipelines.JsonWriterPipeline': 800, >}

分配给每个类的整型值,确定了他们运行的顺序,item按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内。

那么什么是Item Pipeline组件呢?

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。
每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。
以下是item pipeline的一些典型应用:

  • 清理HTML数据
  • 验证爬取的数据(检查item包含某些字段)
  • 查重(并丢弃)
  • 将爬取结果保存到数据库中

如果你想了解更多item pipeline组件相关的知识,请自行阅读官方文档

2.设置item pipelines组件

将你的 *pipelines.py 代码添加以下代码

 def *_item(self, item, spider):

        with open('data_cn1.json', 'a') as f:
            json.dump(dict(item), f, ensure_ascii=False)
            f.write(',\n')
        return item

其中重点关注一下json.dump函数
根据查看json的源码中的注释发现:

If ensure_ascii is false, then the strings written to fp can
contain non-ASCII characters if they appear in strings contained in
obj. Otherwise, all such characters are escaped in JSON strings.
如果ensure_ascii为false,那么写入fp的字符串可以包含非ASCII字符。否则,所有这些字符都会在JSON字符串中转义。

也就是说json.dump函数将获取到item转化成字符串中存入json文件,并且 将参数ensure_ascii设为False使得中文(UTF-8编码)不经过转义,也就不会乱码


参考: