Python爬虫之本地存储
我认为爬虫的存储分两大类
1.本地存储
2.数据库存储
今天来说一说数据的本地存储
- 本地存储又分为三种
1.TXT文件形式存储
2.csv或xlsx形式存储
3.JSON形式存储 - 接下来对比一下三种方式的优缺点
1.TXT形式存储,优点是兼容任何平台,缺点也很明显,不利于检索,如果是对数据的结构和检索要求比较高,不适合用这个
2.CSV或者XLSX形式存储,也可以叫作逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据或纯数据的表格形式,优点是结构清晰,一般情况下爬虫爬取的都是结构化的数据,所以这种形式存储用的非常多
3.JSON形式存储,JSON的全称为 JavaScript Object Notation 也就 JavaScript对象标记,它通过对象和数组的组合来表示数据,构造简洁并且结构化程度高,是一种轻量级的数据格式 - 存储的写法
三种存储其实都差不多,只是在一些特殊的地方有些不同
1.TXT形式写入
with open ("test.txt","a") as f:
f.write(result)
2.CSV形式写入
需要先导入CSV库
import CSV
with open('test.csv','w',encoding='utf-8',newline='') as f:
writer = csv.writer(f) #获取文件
writer.writerow(headers) #写入标题
writer.writerow(value) #写入一行记录
writer.writerows(values) #写入多行记录时,传入的参数为列表结构
字典形式写入
with open('test.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f,headers) #获取文件
writer.writeheader() #写入记录标题
writer.writerows(values) #写入多行记录
注意:在打开待写入CSV文件时,这里我们还传入了一个newline参数,并且其值为空字符串,这么做是为了防止在每次写完一行后其会自动再写入一个换行符,使用encoding是为了防止乱码
3.JSON形式写入
JSON中的引号必须是双引号,否则会报错
import JSON
data= [{
'name ’: Bob ’,
'gender ' : ' male ’
}]
with open ('test.json','a') as f:
f.write(json . dumps(data))
利用 dumps ()方法,我们可以将 JSON 对象转为字符串,然后再调用文件的 write ()方法写入文本,如果想要输出中文添加参数
ensure_ ascii=False
4.我们这里多次使用了open,那么我们来介绍一下open方法
open函数用来打开或创建一个文件
现在大多数情况下已经不单独使用open因为单独使用open时候最后需要f.close() ,如果和with连用,那么就不需要关闭文件,也就是
with open()
- open里的常用参数
1.路径
'test.txt'
前面可以添加路径('C:/Users/shu/Desktop/python/test.txt'),如果不添加默认保存到项目的文件夹下
2.打开方式
r :以只读方式打开文件 文件的指针将会放在文件的开头 这是默认模式
rb :以 进制只读方式打开一个文 文件指针将会放在文件的开头
r+ :以读写方式打开一个文件 文件指针将会放在文件的开头
rb+: 以二进制读写方式打开一个文件 文件指针将会放在文件的开头
w:以写入方式打开一个文件 如果该文件已存在,则将其覆盖 如果该文件不存在,则创 建新文件
wb :以 进制写入方式打开一个文 如果该文件已存在,则将其覆盖 如果该文件不存 在, 则创建新文件
w+:以读写方式打开一个文件 如果该文件已存在,则将其覆盖 如果该文件不存在,则创 建新文件
wb+:以二进制读写格式打开一个文 果该文件已存在, 将其覆盖 如果该文件不存 在, 则创建新文件
a:以追加方式打开一个文 如果该文件已存在,文件指针将会放在文件结尾 也就 说,新的内容将会被写入到已有内容之后 果该文件不存在, 则创建新文件来写入
ab :以 进制追加方式打开 个文件 如果该文件已存在,则文件指针将会放在文件结尾 也就是说,新的内容将会被写入到己有内容之后 如果该文件不存在,则创建新文件来写入
a+:以读写方式打开一个文件 如果该文件已存在,文件指针将会放在文件的结尾 文件打 开时会是追加模式 如果眩文件不存在,则创建新文件来读写
ab+:以二进制追加方式打开 个文件 如果该文件已存在,则文件指针将会放在文件结尾 如果该文件不存在,则创建新文件用于读写
挑选自己需要的使用。
3.编码方式
不要小看这步,好多乱码都是因为它,一般为如下:
encoding='UTF-8'
二、数据库存储
1.MySQL存储
conn=pymysql.connect(host="localhost",port=3306,user="root",passwd="root",db="test",charset='utf-8')#创建连接,需要先创建名为test的数据库
cur=conn.cursor()#使用cursor创建一个游标
cur.excute("insert into test(name,age) value(%s,%d)"%(name,age))# %s是中文,%d是数字
conn.commit()#对数据库有改变时,记得提交
cur.close()
conn.close()
2.Redis数据库
key-value存储的Nosql数据库
高性能,可用作分布式存储
client=redis.Redis(host='localhost',port=6379)#创建数据库连接
client.set('key','value')#没有的话就创建,有的话就更新
client.append('name','james')#在已有的信息后面添加
print(client.keys())#查看当前有多少key
3.mongodb
client = pymongo.MongoClient(host='127.0.0.1',port=27017)#创建数据库连接
#或者直接传入地址
client = pymongo.MongoClient('mongodb://127.0.0.1:27017/')
#选择数据库
db = client.test # test数据库
db = client['test']#效果相同
person = {
'id':'00001',
'name':'Abc',
'age':19
}
person1 = {
'id':'00002',
'name':'Dfg',
'age':20
}
result = p.insert([person,person1])
# 推荐使用 insert_many() /一条数据insert_one()方法,之后使用 result.inserted_ids 查看插入数据的 _id 列表,返回的都是id值
print(result)
最后惯例:[Python open() 函数详细文档](http://www.runoob.com/python/file-methods.html)
~~不谢