美文网首页
6.数据存储

6.数据存储

作者: MononokeHime | 来源:发表于2018-06-14 12:31 被阅读0次

    scrapy提供了多种将数据保存的方式,例如json,csv

    #scrapy.exporters.py
    
    __all__ = ['BaseItemExporter', 'PprintItemExporter', 'PickleItemExporter',
               'CsvItemExporter', 'XmlItemExporter', 'JsonLinesItemExporter',
               'JsonItemExporter', 'MarshalItemExporter']
    ......
    
    

    JSON

    以下是使用json保存数据的代码

    # pipelines.py
    from scrapy.exporters import JsonItemExporter
    class JsonExporterPipeline(object):
        #调用scrapy提供的json export到处json文件
        def __init__(self):
            self.file = open('article.json','wb')
            self.exporter = JsonItemExporter(self.file,encoding="utf-8",ensure_ascii=False)
            self.exporter.start_exporting()
            
        def process_item(self,item,spider):
            self.exporter.export_item(item=item)
            return item
        
        def close_spider(self,spider):
            self.exporter.finish_exporting()
            self.file.close()
    

    补充:关于json的知识点

    首先明确一点:json本质上就是字符串

    • python对象->json使用json.dumps(python对象)
    • json->python对象使用json.loads(json字符串)
    • json字符串中的值必须用双引号,见下例

    在python中。只有基本的数据类型才能转换成json格式的字符串,也即:int,float,str,list,tuple,dict

    将python对象dumps成json字符串

    import json
    pesron = [{'user':'zs','age':10},
              {'user': 'ls', 'age':20}]
    
    json_str = json.dumps(pesron)
    print(type(json_str))
    print(json_str)
    

    输出

    <class 'str'>
    [{"user": "zs", "age": 10}, {"user": "ls", "age": 20}]
    

    使用json.dump的时候,只能存放ascii的字符,因此会将中文进行转义,这时候我们可以做使用ensure_ascii=False关闭这个特性。

    将json字符串loads成python对象

    import json
    #json_str = "[{'user':'zs','age':10},{'user': 'ls', 'age':20}]"  错误,必须用双引号
    json_str = """[{"user":"zs","age":10},{"user": "ls", "age":20}]"""
    
    person = json.loads(json_str)
    print(type(person))
    print(person)
    

    输出

    <class 'list'>
    [{'user': 'zs', 'age': 10}, {'user': 'ls', 'age': 20}]
    

    MySQL

    python要操作MySQL,必须要有一个中间件,或者叫做驱动程序。常用的是mysqlclient和pymysql。在这里我们选择pymysql,安装非常简单,通过命令

    pip install pymysql
    

    数据库的连接

    数据库连接之前,首先要创建库以及表,同时不要忘记打开MySQL服务,确保3306端口在监听

    import pymysql
    
    conn = pymysql.connect(
        host='127.0.0.1',
        user='root',
        password='123456',
        database='test',
        port=3306
    )
    
    cursor = conn .cursor()
    cursor.execute('select * from dept_emp')
    result = cursor.fetchall()
    conn.close()
    print(result )
    

    插入数据

    import pymysql
    
    conn = pymysql.connect(
        host='127.0.0.1',
        user='root',
        password='123456',
        database='test',
        port=3306
    )
    
    cursor = conn.cursor()
    sql = """
    insert into user(id,username,age) values(null,%s,%s)
    """
    cursor.execute(sql,('zs',20))
    conn.commit()
    conn.close()
    

    查找数据

    使用pymysql查询数据,可以使用fetch*方法

    • fetchone():每次只获取一条数据
    • fetchall():获取全部的返回结果
    • etchsize(size):可以获取指定的数据
    import pymysql
    
    conn = pymysql.connect(
        host='127.0.0.1',
        user='root',
        password='123456',
        database='test',
        port=3306
    )
    
    cursor = conn.cursor()
    cursor.execute('select * from dept_emp')
    results = cursor.fetchall()
    for result in results:
        print(result)
    conn.close()
    

    删除/更新数据

    .......
    cursor = conn.cursor()
    sql = """
    delete from user where id=1
    """
    cursor.execute(sql)
    conn.commit()
    conn.close()
    

    MomgoDB数据库

    MongoDB是一个基于分布式文件存储的NoSQL数据库。在处理海量数据的时候比MySQL更有优势。爬虫如果上了一个量级,可能就会比较推荐使用MongoDB,当然没有上量的数据完全可以使用MongoDB来存储数据。

    MongoDB的安装
    下载:https://www.mongodb.com/download-center?jmp=nav#community
    具体安装过程略

    MongoDB概念介绍

    SQL术语 MongoDB术语 解释
    database database 数据库
    table collection 数据库/集合
    row document 数据记录行/文档
    column field 字段
    index index 索引
    primary key primary key 主键,MongoDB自动将_id设置为主键

    MongoDB三元素:
    三元素:数据库,集合,文档
    1.集合(collection):就是关系型数据库中的表。可以存储多个文档,结构可以不固定。如存储下面文档在一个集合中

    {'name':'abc','gender':'1'}
    {'name':'xxx','age':18}
    {'title':'yyy','price':20.9}
    

    2.文档(document):就是关系型数据库中的一行。文档是一个对象,有键值构成,是json的扩展形式

    {'name':'abc','gender':'1'}
    

    MongoDB基本操作命令:
    1.db:查看当前的数据库
    2.show dbs:查看所有的数据库
    3.use 数据库名:切换数据库。如果数据库不存在,则创建一个
    4.db.dropDatabase():删除当前指向的数据库
    5.db.集合名.insert(value):添加数据到指定的集合中
    6.db.集合名.find():从指定的集合中查找数据

    Python操作MongoDB
    安装pymongo

    pip install pymongo
    

    数据类型:

    类型 说明
    ObjectID 文档ID
    String 字符串,最常用,必须是有效的UTF-8
    Boolean true或false
    Integer 整数
    Double 浮点数
    Arrays 数组
    Object 用于嵌入式文档,即一个值为一个对象
    Null Null值
    Timestamp 时间戳
    Data 日期

    1.连接数据库

    import pymongo
    
    client = pymongo.MongoClient('127.0.0.1',port=27017)
    
    # 获取数据库(如果没有这个数据库也没关系)
    
    db = client.liang
    
    # 获取数据库中的集合,也就是mysql中的表
    collection = db.qa
    
    # 写入数据
    collection.insert({'username':"aaa"})
    

    2.find_one:查找一条文档

    result = collection.find_one()
    print(result)
    # 或者指定条件
    result = collection.find_one({'username':"aaa"})
    print(result)
    # 查找所有
    result = collection.find()
    for i in result:
        print(i)
    

    输出

    {'_id': ObjectId('5b21ea9fb70e101a881f4840'), 'username': 'aaa'
    

    3.update:更新文档

    collection.update({"username":"abc"},{"username":"xxx"})
    

    4.delete_one:删除文档

    collection.delete({"username":"abc"}) #删除abc的第一条文档
    collection.delete({"username":"abc"})  # 删除abc的所有文档
    

    相关文章

      网友评论

          本文标题:6.数据存储

          本文链接:https://www.haomeiwen.com/subject/bxbvsftx.html