前言:通过爬虫解析出网页数据之后,就要对数据进行存储。保存的形式多种多样,最简单的形式是保存为文本形式,如TXT、JSON、CSV、XLSX等。另外还可以保存在数据库之中,如关系型数据库MySQL,非关系型数据库MongoDB、Redis等。
一、文件储存
1、TXT文本储存
将数据保存为TXT文本的操作方式非常简单,而且TXT基本兼容任何平台且不依赖配置环境。但是缺点是不利于检索。如果对检索或者数据结构要求不高的,最求方便的话,就可以采用TXT文本储存。
with open('存储地址/存储名和文件格式', '打开方式', encoding='utf-8') as f:
f.read('文件名') # 用于打开文件
f.write('变量名') # 用于写入文件
f.close() # 加上上下文管理器with关键字,就不需要写close关闭方法
'''
f.read(): 读取整个文件的内容。
f.readline(): 逐行读取文件内容。
f.readlines(): 以列表形式读取文件的所有行。
'''
2、打开方式
open函数的第一个函数是存储路径及文件名,第二个参数是文件的打开方式( r:读;w:写;a:追加 )。主要有下面的一些方法:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针放在文件的开头,这是默认的模式。 |
rb | 以二进制只读方式打开一个文件。文件指针将会放在文件的开头。 |
r+ | 以读写的方式打开一个文件。文件的指针将会放在文件的开头。 |
rb+ | 以二进制读写方式打开一个文件。文件指针将会放在文件的开头。 |
w | 以写入方式打开一个文件,如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。 |
wb | 以二进制写入方式打开一个文件。如果该文件已经存在,则将其覆盖。如果文件不存在,则创建文件。 |
w+ | 以读写方式方式打开一个文件。如果该文件已经存在,则将其覆盖。如果该文件不存在,则创建新文件。 |
wb+ | 以二进制读写格式打开一个文件。如果该文件已经存在,则将其覆盖。如果该文件不存在,则创建新文件。 |
a | 以追加方式打开一个文件。如果该文件已经存在,文件指针将会放在文件末尾。也就是说,新的内容会写在旧的内容之后。如果该文件不存在,则创建新文件来写入。 |
ab | 以二进制追加的方式打开一个文件。如果该文件已经存在,则文件指针将会放在文件末尾。也就是说,新的内容会写在旧的内容之后。如果该文件不存在,则创建新文件来写入。 |
a+ | 以读写方式打开一个文件,如果该文件已经存在文件的指针将会放在文件的末尾。文件打开时会是追加模式。如果文件不存在,则创建新文件来读写。 |
ab+ | 以二进制追加方式打开一个文件。如果该文件存在,则文件指针将会放在文件末尾。如果该文件不存在,则创建新文件用于读写。 |
3、JSON文件存储
JSON,全称JavaScript Object Notation,也就是JavaScript对象标记,它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量的数据交换格式。
3.1读取JSON
Python为我们提供了简单易用的JSON库来实现JSON数据的处理,可以通过loads()方法将JSON文本字符串转为JSON对象,可以通过dumps()方法将JSON对象转换为文本字符串。示例:
import json
str = '''
[{
"name":"Bob",
"gender":"male",
"birthday":"1992-10-18"
}, {
"name":"Selina",
"gender":"female",
"birthday":"1995-10-18"
}]
'''
data = json.loads(str)
print(type(data))
'''
>>> <class 'list'>
索引取值:data[0]["name"];data[0].get("name")
'''
注意:JSON的数据需要用到双引号来包裹,不能使用单引号。使用单引号通过loads()方法就会产生错误。
3.2输出JSON
还可以使用dumps()方法将字典转换为字符串。例如,将上列中的列表重新写入文本:
import json
data = [{
'name':'Bob',
'gender':'male',
'birthday':'birthday'
}]
with open('data.json', 'w') as file:
file.write(json.dumps(data, indent=2))
'''
(1)dumps()将有中文的列表进行保存为JSON文件记得添加关键字:ensure_ascii=False
(2)在dumps方法中通过indent关键字参数,可以保存到文件展现出下面这种样式,而不是一行:
[
{
"name": "Bob",
"gender": "male",
"birthday": "birthday"
}
]
'''
JSON方法:
-
json.load:表示读取文件,返回python对象( 示例: a_json = json.load(open('demo.json','r')) )
-
json.dump:表示写入文件,文件为json字符串格式,无返回
( 示例:a_dict = {'a':'1111','b':'2222'};json.dump(a_dict, open('demo.json', 'w') )
-
json.dumps:将python中的字典类型转换为字符串类型,返回json字符串
-
json.loads:将json字符串转换为字典类型,返回python对象
-
load和dump处理的主要是文件
-
loads和dumps处理的是字符串
4、CSV文件储存
(1)CSV,全称为Comma-Separated Values,是一种以逗号分隔符或者字符分隔值,其文件以纯文本形式存储表格数据。来看一个简单的例子:
import csv
with open('data.csv', 'w') as csvfile:
writer = csv.writer(csvfile) # 修改分隔符可以传入delimiter参数
writer.writerow(['id', 'name', 'age']) # 写入的行
writer.writerow(['1001', 'Mike', 20])
writer.writerow(['1002', 'Bob', 22])
writer.writerow(['1003', 'Jordan', 21])
writer.writerows('参数:传入二维表格, [[],[],[],]')
(2)但是一般情况下爬虫提取都是结构化数据,我们一般使用字典来表示。在csv库中也提供了字典的写入方式,示例如下:
import csv
with open('data.csv', 'w') as csvfile:
'''
想追加写入的话就是用'a',遇见编码问题加上encoding='utf-8'
'''
fieldnames = ['id', 'name', 'age']
writer = csv.DictWriter(csvfile, fieldnames = fieldnames)
writer.writeheader()
writer,writerow({'id':'1001', 'name':'Mike', 'age':20})
writer,writerow({'id':'1002', 'name':'Bob', 'age':22})
(3)另外还有一种写入和储存的库就是pandas,简单示例如下:
import pandas as pd
df = pd.read_csv('data.csv')
print(df)
'''
由于pandas和numpy库方法方法众多就不一一列举。
'''
5、关系型数据库存储
关系型数据库就是基于关系模型的数据库,关系型数据库一般是通过二维表来保存的,所以他的储存方式就是行列组成的表。主键外键的关联关系,多个表组成一个数据库,也就是关系型数据库。当然也可以用非关系型数据库存储,但是这里先不介绍非关系型数据库。
5.1 连接数据库
import pymysql # 通过pymysql这个库来对数据库进行操作
db = pymysql.connect(host='localhost', user='root', password='root123', port=3306) # 连接
'''
当需要在数据库当中创建表的时候,需要在connect里面添加db关键字,值为想添加表的数据库名称
'''
cursor = db.cursor() # 获取MySQL的操作游标
cursor.execute('SELECT VERSION()') # 通过execute方法执行SQL语句
data = cursor.fetchone()
print('Database version:', data)
cursor.execute("CREATE DATABASE IF NOT EXISTS mydatabase CHARACTER SET utf8 COLLATE utf8_general_ci;")
'''
通过execute方法来执行数据库命令创建数据库
'''
db.close()
'''
在数据书的数据表中插入数据除了需要execute方法执行sql语句外,还需要在后面跟上db.commit()用于插入数据的提交
'''
备注:pymysql库还有增删改查的数据库操作,但是由于太过于繁多,就不一一列举了。对于非关系型数据库存储由于自己暂时也用不到,就先不罗列介绍。