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 tofp
can
contain non-ASCII characters if they appear in strings contained inobj
. Otherwise, all such characters are escaped in JSON strings.
如果ensure_ascii
为false,那么写入fp
的字符串可以包含非ASCII字符。否则,所有这些字符都会在JSON字符串中转义。
也就是说json.dump函数将获取到item转化成字符串中存入json文件,并且 将参数ensure_ascii设为False使得中文(UTF-8编码)不经过转义,也就不会乱码
参考: