使用背景
有时候为了做测试,不想去数据库设置字段,设置musql字段实在是太麻烦了,这种情况下可以先把存储到json文件中,并观察数据的正确性,如果数据没问题了,再改成mysql存储即可。
有时候任务本身就是要存储进json文件中。
有时候为了更好的阅读数据,看结构,json文件是一个不错的选择
在pipeline写json存储
存储的好处与逻辑:
在pipeline写json存储,代码分离性比较好
写文件涉及到打开关闭,在init进行打开操作,close进行关闭操作
scrapy中数据流过process_item方法,所以对它进行重载,进行数据的写入
通过信号量进行close操作
具体的代码实现
根据整理好的逻辑来编写代码(在pipelines.py中新增)
import codecs,json
class JsonCreatePipeline(object):
"""
将数据保存到json文件,由于文件编码问题太多,这里用codecs打开,可以避免很多编码异常问题
在类加载时候自动打开文件,制定名称、打开类型(只读),编码
重载process_item,将item写入json文件,由于json.dumps处理的是dict,所以这里要把item转为dict
为了避免编码问题,这里还要把ensure_ascii设置为false,最后将item返回回去,因为其他类可能要用到
调用spider_closed信号量,当爬虫关闭时候,关闭文件
"""
def __init__(self):
self.file = codecs.open('spiderdata.json', 'w', encoding="utf-8")
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()
启用pipelines
写好代码后,还需要在settings中启用,然后在settings的ITEM_PIPELINES处将JsonCreatePipeline配置进去就可以运行了:
'rspider.pipelines.JsonCreatePipeline':200, # 开启json文件保存 数字任意
它会自动为你创建一个名为spiderdata.json的文件,里面写满了你爬到的数据,你可以在Pycharm中直接打开它,并且通过快捷键格式化数据(这样你才能更好的阅读数据和校验数据)。
结语
爬虫编写过程中,很重要的一步就是校验数据,因为数据是可变的,如果你不去校验它,那么入库的时候就会产生很多的麻烦。我的做法是边写边校验,以确保能够及时的修正代码。