python3爬虫实战笔记(5)数据存储

各种格式文本存储

文件存储形式多种多样,比如可以保存成TXT纯文本形式,也可以保存为JSON格式、CSV格式等

TXT文件存储

file = open('explore.txt', 'a', encoding='utf-8')
    file.write('\n'.join([question, author, answer]))
    file.write('\n' + '=' * 50 + '\n')
    file.close()

这里open()方法的第一个参数即要保存的目标文件名称,第二个参数为a,代表以追加方式写入到文本。另外,我们还指定了文件的编码为utf-8。最后,写入完成后,还需要调用close()方法来关闭文件对象。
也可简写为:

with open('explore.txt', 'a', encoding='utf-8') as file:
    file.write('\n'.join([question, author, answer]))
    file.write('\n' + '=' * 50 + '\n')
r:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb:以二进制只读方式打开一个文件。文件指针将会放在文件的开头。
r+:以读写方式打开一个文件。文件指针将会放在文件的开头。
rb+:以二进制读写方式打开一个文件。文件指针将会放在文件的开头。
w:以写入方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
wb:以二进制写入方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
w+:以读写方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
wb+:以二进制读写格式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
a:以追加方式打开一个文件。如果该文件已存在,文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,则创建新文件来写入。

ab:以二进制追加方式打开一个文件。如果该文件已存在,则文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,则创建新文件来写入。

a+:以读写方式打开一个文件。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,则创建新文件来读写。
ab+:以二进制追加方式打开一个文件。如果该文件已存在,则文件指针将会放在文件结尾。如果该文件不存在,则创建新文件用于读写。

区分:

  1. r开头不创建新文件,w,a则会
  2. r指针放在文件开头,w会覆盖,a则接以前内容
  3. 有b为二进制形式
  4. 有+为可写

JSON文件存储

SON,全称为JavaScript Object Notation, 也就是JavaScript对象标记,它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。

读取json

loads()将字符串转为JSON对象

import json
 
str = '''
[{
    "name": "Bob",
    "gender": "male",
    "birthday": "1992-10-18"
}, {
    "name": "Selina",
    "gender": "female",
    "birthday": "1995-10-18"
}]
'''
print(type(str))
data = json.loads(str)
print(data)
print(type(data))

请千万注意JSON字符串的表示需要用双引号,否则loads()方法会解析失败。

data[0].get('age')
data[0].get('age', 25)

通过中括号加0索引,可以得到第一个字典元素,然后再调用其键名即可得到相应的键值
其实在原字典中该键名不存在,此时默认会返回None。如果传入第二个参数(即默认值),那么在不存在的情况下返回该默认值。

import json
 
with open('data.json', 'r') as file:
    str = file.read()
    data = json.loads(str)
    print(data)
输出JSON

dumps()方法将JSON对象转化为字符串

import json
 
data = [{
    'name': 'Bob',
    'gender': 'male',
    'birthday': '1992-10-18'
}]
with open('data.json', 'w') as file:
    file.write(json.dumps(data))

如果想保存JSON的格式,可以再加一个参数indent,代表缩进字符个数。

with open('data.json', 'w') as file:
    file.write(json.dumps(data, indent=2))

为了输出中文,还需要指定参数ensure_ascii为False,另外还要规定文件输出的编码

with open('data.json', 'w', encoding='utf-8') as file:
    file.write(json.dumps(data, indent=2, ensure_ascii=False))

CSV文件存储

CSV,全称为Comma-Separated Values,中文可以叫作逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。

写入
import csv
 
with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['10001', 'Mike', 20])
    writer.writerow(['10002', 'Bob', 22])

如果想修改列与列之间的分隔符,可以传入delimiter参数

with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile, delimiter=' ')
    writer.writerow(['id', 'name', 'age'])

我们也可以调用writerows()方法同时写入多行,此时参数就需要为二维列表

writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])

一般情况下,爬虫爬取的都是结构化数据,我们一般会用字典来表示。

import csv
 
with open('data.csv', 'w') as csvfile: # 如果是追加,把‘w'改为’a'
    fieldnames = ['id', 'name', 'age']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'id': '10001', 'name': 'Mike', 'age': 20})
    writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22})
    writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})

如果要写入中文内容的话:

with open('data.csv', 'a', encoding='utf-8') as csvfile:

如果接触过pandas等库的话,可以调用DataFrame对象的to_csv()方法来将数据写入CSV文件中

读取
import csv
 
with open('data.csv', 'r', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)

如果接触过pandas的话,可以利用read_csv()方法将数据从CSV中读取出来

import pandas  as pd
 
df = pd.read_csv('data.csv')
print(df)

数据库存储

关系型数据库

它的存储方式就是行列组成的表,每一列是一个字段,每一行是一条记录。表可以看作某个实体的集合,而实体之间存在联系,这就需要表与表之间的关联关系来体现,如主键外键的关联关系。多个表组成一个数据库,也就是关系型数据库。

关系型数据库有多种,如SQLite、MySQL、Oracle、SQL Server、DB2等。

MySQL

安装与配置
因为原文写的非常清楚,故不再细数

非关系型数据库

键值存储数据库:代表有Redis、Voldemort和Oracle BDB等。
列存储数据库:代表有Cassandra、HBase和Riak等。
文档型数据库:代表有CouchDB和MongoDB等。
图形数据库:代表有Neo4J、InfoGrid和Infinite Graph等。

对于爬虫的数据存储来说,一条数据可能存在某些字段提取失败而缺失的情况,而且数据可能随时调整。另外,数据之间还存在嵌套关系。如果使用关系型数据库存储,一是需要提前建表,二是如果存在数据嵌套关系的话,需要进行序列化操作才可以存储,这非常不方便。如果用了非关系型数据库,就可以避免一些麻烦,更简单高效。

Mongodb

安装与配置mongodb

启动mongodb方法:以管理员身份cmd输入net start mongodb

使用
插入数据
result = collection.insert_one(student)
result = collection.insert([student1, student2])

1.在cmd下切换到mongodb的bin目录下。

2.然后输入mongo,就可以查看当前mongo的版本号。

3.执行完第二步后,就会出现>>。

4.然后使用下面的命令可以操作数据库。

show dbs 可以查看所有的数据库

db 可以查看当前的数据库名称

show collection 可以查看当前数据库下的集合

use   test(数据库的名称) 切换到指定的数据库

db.集合名.操作  对集合进行某种操作

比如:

db.集合名.find() 查找

db.集合名.getIndexes() 查看索引
————————————————
版权声明:本文为CSDN博主「yasinzhang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/z784561257/article/details/89760829
其余见链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值