爬虫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

posted @ 2018-12-29 11:43  bitterz  阅读(234)  评论(0编辑  收藏  举报