七、学习分布式爬虫之数据存储

数据存储

  1. JSON文件格式处理:网络交互
  2. CSV文件格式处理:数据分析
  3. Excel文件处理:数据分析和运营
  4. MySQL数据库处理:数据分析和网站

JSON文件格式处理

  1. JSON字符串介绍
    JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式。它基于ECMAScript(w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输速率。
    JSON支持数据格式:
    对象(字典):使用花括号{}。
    数组(列表):使用方括号[]。
    字符串类型:字符串必须要用双引号,不能用单引号。
    整形、浮点型、布尔型还有null类型。
    多个数据之间使用逗号分开。
    注意:JSON本质上就是一个字符串
  2. JSON字符串写入
  3. JSON字符串读取
import json

books = [
    {
        'name':'三国演义',
        'price':56.32,
    },
    {
        'name': '水浒传',
        'price': 55.12,
    },
]
# json_str = json.dumps(books,ensure_ascii=False) #ensure_ascii=True时只支持ascii码
# print(json_str)  #[{"name": "三国演义", "price": 56.32}, {"name": "水浒传", "price": 55.12}]
# print(type(json_str))  #<class 'str'>

# res = json.loads(json_str)
# print(res)
# print(type(res)) #<class 'list'>

# fp = open('books.json','w',encoding='utf-8')
# json.dump(books,fp,ensure_ascii=False)

with open('books.json','r',encoding='utf-8') as f:
    res = json.load(f)
    print(res)
    print(type(res))

#dumps可以将python对象转化成json格式的字符串,loads则相反
#dump可以将python对象转化成json格式的字符串并保存在文件中,load则相反
#dumps和dump这两个方法都有一个ensure_ascii参数,默认情况下这个参数的值是True,也就是说转换后的JSON字符串只能存储ascii格式的,如果想要存储成中文的,那么可以将它设置成False

CSV文件格式处理

读取CSV文件的两种方式

import csv

#第一种:这种方式读取到的每一条数据是一个列表
with open('stock.csv','r',encoding='utf-8') as f:
    reader = csv.reader(f)#创建一个可读对象
    for x in reader:
        print(x) #列表

#第二种:这种方式读取到的每一条数据是一个字典
with open('stock.csv','r',encoding='utf-8') as f:
    reader = csv.DictReader(f)#创建一个可读对象
    for x in reader:
        print(x['secShortName']) #字典

写入CSV文件的两种方式

  1. 使用writerow:写入数据到csv文件,需要创建一个writer对象,主要用到两个方法。一个是writerow写入一行(一般先写表头),一个是writerows写入多行(写数据)
  2. 使用DicWriter:也可以使用字典的方式把数据写入进去。
import csv

# header = ('name','age','height')
# students = [('wuyuli',18,182),('zhangsan',15,170),('lisi',16,180)]
# with open('students.csv','w',encoding='utf-8',newline='') as f: #newline=''指定不换行
#     writer = csv.writer(f)
#     writer.writerow(header) #先写表头
#     writer.writerows(students) #再写数据

header = ('name','age','height')
students = {
    {'name':'wuyuli','age':18,'height':182},
    {'name': 'zhangsan', 'age': 15, 'height': 165},
    {'name': 'lisi', 'age': 20, 'height': 180},
}

with open('students.csv','w',encoding='utf-8',newline='') as f: #newline=''指定不换行
    writer = csv.DictWriter(f,header)
    #虽然DictWriter创建的时候有一个header,但是想要写入数据进去,还需要调用writer.writeheader()方法,否则表头写不进去
    writer.writeheader()
    writer.writerows(students)

Excel文件处理

  1. 读取Excel文件。
  2. 编辑Excel文件。
    在爬虫开发中,我们主要关注Excel文件的读写,不过过多的关心Excel中的一些样式,如果想要读写Excel文件,需要借助到两个库xlrd和xlwt,其中xlrd是用于读的,xlwt是用于写的,安装命令如下:
    pip insatll xlrd
    pip insatll xlwt
    读取Excel文件
import xlrd

workbook = xlrd.open_workbook("成绩表.xlsx")

#######################sheet相关操作##################################
#获取所有的sheet的名字
print(workbook.sheet_names()) #['1班', '2班']

#sheet_by_index根据索引获取sheet对象
sheet = workbook.sheet_by_index(0)
print(sheet.name) #1班

#sheet_by_name根据名字获取sheet对象
sheet = workbook.sheet_by_name('2班')
print(sheet.name) #2班

#sheets获取所有的sheet
sheets = workbook.sheets()
for sheet in sheets:
    print(sheet.name)

#sheet.nrows:这个sheet中的行数
#sheet.ncols:这个sheet中的列数
sheet = workbook.sheet_by_index(0)
print('列数:',sheet.ncols,'行数:',sheet.nrows)


#######################cell相关操作##################################
sheet = workbook.sheet_by_index(0)
#获取cell及其属性,每个cell代表的是表格中的一格
#1.sheet.cell(row,col):获取指定行和列的cell对象
cell = sheet.cell(0,0) #获取0行0列的cell
print(cell)
print(cell.value)

#2.sheet.row_slice(row,start_col,end_col):获取指定行的某几列的cell对象
cells = sheet.row_slice(2,0,4)
for cell in cells:
    print(cell.value)

#3.sheet.col_slice(col,start_row,end_row):获取指定列的某几行的cell对象
cells = sheet.col_slice(0,1,19)
for cell in cells:
    print(cell.value)

#4.sheet.cell_value(row,col):获取指定行和列的值
cell = sheet.cell_value(1,0)
print(cell)

#5.sheet.row_values(row,start_col,end_col):获取指定行的某几列的值
cells = sheet.row_values(2,0,3)
for cell in cells:
    print(cell)

#6.sheet.col_values(col,start_row,end_row):获取指定列的某几行的值
cells = sheet.col_values(0,1,5)
for cell in cells:
    print(cell)

cell的数据类型

  1. xled.XL_CELL_TEXT(Text):文本类型
  2. xled.XL_CELL_NUMBER(Number):数值类型
  3. xled.XL_CELL_DATE(Date):日期时间类型
  4. xled.XL_CELL_BOOLEAN(Bool):布尔类型
  5. xled.XL_CELL_EMPTY(Empty):空白数据类型
#######################cell的数据类型##################################
import xlrd
workbook = xlrd.open_workbook("成绩表.xlsx")
sheet = workbook.sheet_by_index(0)

cell = sheet.cell(0,0)
print(cell.value) #姓名
print(cell.ctype) #1:代表文本类型
print(xlrd.XL_CELL_TEXT) #1

cell = sheet.cell(2,2)
print(cell.value) #100.00
print(cell.ctype) #2:代表数值类型
print(xlrd.XL_CELL_NUMBER) #2

cell = sheet.cell(19,0)
print(cell.value) #43748.0
print(cell.ctype) #3:代表时间日期类型
print(xlrd.XL_CELL_DATE) #3

cell = sheet.cell(19,1)
print(cell.value) #1
print(cell.ctype) #4:代表布尔类型
print(xlrd.XL_CELL_BOOLEAN) #4

cell = sheet.cell(1,1)
print(cell.value) #
print(cell.ctype) #0:代表空白数据类型
print(xlrd.XL_CELL_EMPTY) #0

写入Excel文件
步骤如下:

  1. 导入xlwt模块
  2. 创建一个Workbook对象
  3. 创建一个Sheet对象
  4. 使用sheet.write方法把数据写入到Sheet下指定行和列中。如果想要在原来workbook对象上添加新的cell,那么需要调用put_cell来添加
  5. 保存成Excel文件
import xlwt
import random

workbook = xlwt.Workbook()
sheet = workbook.add_sheet("sheet1") #添加一张表格
headers = ['姓名','语文','数学','英语']
for index,header in enumerate(headers):
    sheet.write(0,index,header)

names = ['张三','李四','王五']
for index,name in enumerate(names):
    sheet.write(index+1,0,name)

for row in range(1,4):
    for col in range(1,4):
        sheet.write(row,col,random.randint(1,100))

workbook.save('成绩表1.xls')

编辑Excel文件

import xlwt
import xlrd

#读取
rwb = xlrd.open_workbook('成绩表.xlsx')
rsheet = rwb.sheet_by_index(0)

#求总分
rsheet.put_cell(0,4,xlrd.XL_CELL_TEXT,'总分',None) #在原有的数据上添加
nrows = rsheet.nrows #总行数
ncols = rsheet.ncols #总列数
for row in range(1,nrows):
    grades = rsheet.row_values(row,1,4)
    total = sum(grades)
    rsheet.put_cell(row,4,xlrd.XL_CELL_NUMBER,total,None)

#求科目平均分,行数和列数会随着数据的增加而改变,所以每做一次操作读取一个行数和列数
nrows = rsheet.nrows
ncols = rsheet.ncols
for col in range(1,5):
    sigle_grades = rsheet.col_values(col,1,nrows)
    avg = sum(sigle_grades)/len(sigle_grades)
    print(avg)
    rsheet.put_cell(nrows,col,xlrd.XL_CELL_NUMBER,avg,None)

#写入,此时数据只保存在内存当中,需要进行写入操作才能完成表格的保存
wwb = xlwt.Workbook()
wsheet = wwb.add_sheet("sheet1")
nrows = rsheet.nrows
ncols = rsheet.ncols
for row in range(0,nrows):
    for col in range(0,ncols):
        wsheet.write(row,col,rsheet.cell_value(row,col))

wwb.save('abc.xls')

MySQL数据库处理

连接数据库

import pymysql

#1.使用pymysql.connetc()方法连接MySQL数据库
db = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='csdn_crawer')
#2.如果想要操作数据库,还需要获取db上的cursor对象
cursor = db.cursor() #创建游标
#3.使用cursor.execute()来执行sql语句
cursor.execute("select * from article")  #执行SQL语句
res = cursor.fetchone() #提取匹配到的第一条数据
print(res)
  • host:以后在连接外网服务器的时候,就要改成外网服务器的ip地址
  • port:在外网一般会更换端口号,不会为3306,这是为了安全考虑
  • user:连接的用户,一般在生产环境中会单独分配
  • password:这个用户的密码
  • database:要连接操作的数据库名
  • charset:设置为utf8,这样就能操作中文了

数据的插入操作
insert into [表名] (字) values(字段对应的值)

import pymysql

#插入数据
db = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='csdn_crawer') #连接数据库
cursor = db.cursor()

#第一种
# sql = "insert into article(id,title,content) values(null,'wuyuli','995')"
# cursor.execute(sql) #执行

#第二种
title = 'aaa'
content = 'bbb'
sql = "insert into article(id,title,content) values(null,%s,%s)"
cursor.execute(sql,(title,content))

db.commit() #提交
db.close()  #关闭

查找数据
使用pymysql查询数据,可以使用:

  1. fetchone():这个方法每次只获取一条数据
  2. fetchall():这个方法接收全部的返回结果
  3. fetchmany(size):可以获取指定条数的数据
import pymysql
#查找数据
db = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='csdn_crawer') #连接数据库
cursor = db.cursor()

sql = "select id,title from article"
# sql = "select id,title from article where id>3" #查找id>3的数据
cursor.execute(sql) #执行sql语句
res = cursor.fetchone()      #(1, 'abc')返回匹配到数据中的第一条
# res = cursor.fetchall()    #((1, 'abc'), (2, 'wuyuli'), (3, 'aaa')) 返回全部匹配到的数据
# res = cursor.fetchmany(2)  #((1, 'abc'), (2, 'wuyuli')) 返回指定条数的数据
print(res)

db.commit()
db.close()

删除数据
delete from [表名] 条件

import pymysql
#删除数据
db = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='csdn_crawer') #连接数据库
cursor = db.cursor()

sql = "delete from article where id=3"
cursor.execute(sql)

db.commit()
db.close()

更新数据库
update [表名] 更新操作 条件

import pymysql
#更新数据
db = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='csdn_crawer',charset='utf8') #charset指定字符集,插入中文时可能会出错
cursor = db.cursor()

sql = "update article set title='钢铁是怎样练成的',content='第一章' where id=2"
cursor.execute(sql)

db.commit()
db.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值