美文网首页
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.数据存储

    scrapy提供了多种将数据保存的方式,例如json,csv JSON 以下是使用json保存数据的代码 补充:关...

  • Android ContentProvider(一)

    Android数据存储(一) Android数据存储(二) Android数据存储(三) Android数据存储(...

  • day07

    Android的存储方式 使用SharedPreferences存储数据 文件存储数据 SQLite数据库存储数据...

  • 数据库规范参考

    一.数据库对象范围限定1.表2.约束[主键/外键]3.索引4.标量函数5.存储过程6.视图(对外) 二.数据库对象...

  • Java day01 注释,标识符,常量,变量,存储单元,基本数

    1. 注释 2.标识符 3.常量 4.变量 5.计算机存储单元 6.基本数据类型

  • zookeeper数据存储及查看hbase信息

    zookeeper数据存储及查看hbase信息 1.zookeeper数据存储: 1.1内存数据存储、磁盘数据存储...

  • SharedPreferences存储数据

    Android的存储方式 使用SharedPreferences存储数据文件存储数据SQLite数据库存储数据使用...

  • iOS数据存储

    iOS数据存储 数据存储

  • 03Stack栈

    数据结构=数据+存储方式+操作数据 存储什么数据?如int,string类型存储方式 如何组织数据,数据之...

  • iOS App 安全测试

    一、数据存储安全 主要从以下几个方面考虑 Sandbox 数据存储 Keychain 数据存储 Console ...

网友评论

      本文标题:6.数据存储

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