爬虫1.3-数据存储
爬虫-数据存储
1. JSON文件
1.1 JSON数据格式
json是一种轻量级数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,简洁清晰,适合前端和后端数据交换
JSON数据格式
1 对象(字典) 使用花括号{}
2 数组(数组) 使用方括号[]
3 整形、浮点型、布尔型、null型
4 字符串类型(字符串必须要用双引号,不能用单引号)
多个数据之间用逗号分开
json本质上就是一个字符串 python中只有基本数据类型才能转换成JSON格式,int float str list dict tuple
1.2 写入
写入方法一
persons = [{xxx}, {xxxxx}]
json_str = json.dumps(persons) # 此时列表之间被转换成json标准格式(字符串类型),然后一个文件写入就行了
fp.write(json_str)
写入方法二
with open('xx.json', 'w', enconding='utf-8') as fp:
json.dump(persons, fp, ensure_asciii=False)
# 涉及到中文字符时这里传入三个参数,第一个就是包含大量字典的列表,第二个是文件指针,第三个是将json函数默认转换ascii码关闭 另外文件写入时也要使用utf-8格式(enconding='utf-8')
1.3 读取json
json_str = '[{"username": "laowang", "age": 18, "country": "china"}, {"username": "laoli", "age": 11, "country": "china"}]'
persons = json.loads(json_str) 这里persons通过loads函数变成了一个对象,然后下方对其进行操作即可
for i in persons:
print(i)
with open('person.json', 'r', encoding='utf-8') as fp:
persons = json.load(fp) 这时persons通过load函数变成了一个list类的对象,然后可以进行操作了
for i in persons:
print(i)
dump\dumps load\loads 有s 则与字符串有关 没有s则与文件有关
2. CSV文件
2.1 csv数据格式
CSV文件不是一个特定的文件格式,泛指具有以下特征的任何文件:
1 纯文本,使用某个字符集,如utf-8, unicode, ascii, gbk等
2 由记录组成,典型的是每行一条记录
3 每条记录被分隔符分割为字段 典型的分隔符有逗号 分号 制表符
4 每条记录都有同样的文本字段 如 姓名 年龄 身高 体重 每条记录都要有这四个字段
2.2 写入
CSV文件写入方法一:
headers = ['username', 'age', 'height']
data = [('张三', 18, 160),('lisi', 20, 213)]
with open('classroom.csv', 'w', encoding='utf-8', newline='') as fp:
#这里的newlien参数是为了避免写入后又多余的换行
writer = csv.writer(fp)
writer.writerow(headers)
CSV文件写入方法二: 字典直接写入
with open('classroom.csv', 'w', encoding='utf-8', newline='') as fp:
writer = csv.DictWriter(fp, headers) # 这里直接使用DictWriter函数
writer.writerow(data) # writerow每次只写入一条
with open('classroom.csv', 'w', encoding='utf-8', newline='') as fp:
writer = csv.DictWriter(fp, headers) # 这里直接使用DictWriter函数
writer.writeheader() # 这里必须先调用写入头部函数,否则没有头部
writer.writerows(data) # 多条数据,直接使用writerows全部写入即可
3. mysql数据库数据存入
import pymysql
db = pymysql.connect(
host='47.107.110.xx',
user='xxx',
password='xxx',
database='testdb', # 数据库名
port=3306
)
这里要理解,一个数据库服务器可以有多个数据库,所以要选择某个数据库进行操作
新建表格的第一个字段可以设置为自动增长,可以理解为id
sql = """
insert into user(id,username,age,password) values(null,%s,%s,%s)
"""
# 这里使用%s是因为数据库在处理时都先按照字符串的
# null是id 它自动增长可以不用填写
username = 'laowang'
age = 88
password = '123456' # 这样就可以自己灵活施展了
cursor = db.cursor() # cursor是创建一个新的游标,方便执行语句
cursor.execute(sql, (username, age, password)) # 这里要传入一个元组
db.commit() # 必须使用commit提交后, 数据库的数据才会改变
db.close()
查询数据:
fetchone() # 返回一条数据
fetchall() # 接收全部的返回结果
fetchmany(size) # 获取定条数的数据
使用查询语句后,要使用上述三条语句才能获得结果,
result = cursor.fetchone() # 获得一条数据(元组形式)
result = cursor.fetchall() # 获得所有返回的数据((xxx,xxxx,xxx), (yyy,yyyy,yyy))
fetmany(size) # 得到的数据形式与fetchall类似
删除数据:
使用sql = """delete from table where id=1;"""
然后cursor.execute(sql)
db.commit()
# 这里删除时只能删除一整条记录,插入,删除,更新等数据修改操作都需要使用.commit()函数
更新数据
sql = """update table set username='xxx' where id=1;""" 这里sql语句需要指明表 字段 标识
如果不加id=1 就会把整个表的所有记录中的usernam字段都更新为xxx