爬虫数据存储

发布时间 2023-12-22 17:58:09作者: CloudWk

前言:通过爬虫解析出网页数据之后,就要对数据进行存储。保存的形式多种多样,最简单的形式是保存为文本形式,如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关闭方法

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库还有增删改查的数据库操作,但是由于太过于繁多,就不一一列举了。