scrapy框架-将数据写入json文件

使用背景

有时候为了做测试,不想去数据库设置字段,设置musql字段实在是太麻烦了,这种情况下可以先把存储到json文件中,并观察数据的正确性,如果数据没问题了,再改成mysql存储即可。
有时候任务本身就是要存储进json文件中。
有时候为了更好的阅读数据,看结构,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中直接打开它,并且通过快捷键格式化数据(这样你才能更好的阅读数据和校验数据)。

结语

爬虫编写过程中,很重要的一步就是校验数据,因为数据是可变的,如果你不去校验它,那么入库的时候就会产生很多的麻烦。我的做法是边写边校验,以确保能够及时的修正代码。

上一篇:All In All-Flash,阿里云入门级ESSD云盘重磅发布


下一篇:BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】