Python从入门到精通 / 爬虫入门 · 2021年8月18日 0

共100 次浏览

Python爬虫(四)——数据保存

1. 读写Excel

读写excel需要我们另外安装模块openpyxl,直接使用pip的安装方式。

 pip install openpyxl

在写入数据时只需要我们导入Workbook对象就可以创建工作簿。

 from openpyxl import Workbook
 #创建工作簿
 wb=Workbook()

同样的我们如果需要往表中写入数据就需要先创建一张表。如果不指定表明,就会默认为sheet1、sheet2……而当我们操作表时则可以通过表名来获取这张表

 #创建一张表
 sheet = wb.activesheet.title = '表1'
 #创建新表
 sheet2 = wb.create_sheet( '表2')
 #通过表名获取表
 sheet1 = wb['表1']

现在我们已经知道了如何获取工作表,如果需要对表进行操作的话则可以直接指定某一个单元格并为其复值:

 #写入值
 sheet['A1']=20

同样的还有worksheet.cell()的方法操作起来会更方便,直接指定row与column并为其赋值

 sheet.cell(row=4,column=5).value=30
 sheet.cell(row=2,column=9,value=87)

如果对于需要写入的数据是一条一条的,那我们可以直接将需要的写入的数据构建成列表或者元组、字典的形式直接插入即可。就比如我们之前通过数据解析获取到的数据只是将它打印出来,那么我们现在直接将它构建成列表或者元组形式插入到需要操作的表中就可以了。

#默认时添加在表中数据的最底部,即逐行追加从第一行开始
 ws.append([title, info, score, follow])

写入部分已经介绍完毕,接下来便是读表操作。比如给你一个excel表格,里面有若干的数据,如果需要对这些数据进行操作的话,那么首先需要获取这些数据。使用openpyxl模块时先要打开对应的表,刚才我们已经了解过可以通过cell来操作具体的某一个单元格,那么我们在这里使用的时候就可以使用循环来遍历表中的某一列或是某一行,并将其存入到python中的变量中。

 # 打开文件:
 from openpyx1.import load.workbookT教育
 #通过表名获取获取sheet:
 table = wb['sheet2']
 #获取行数和列数:
 rows = tab1e.max_row
 cols = table.max_column
 print(rows,co1s)
 #获取单元格值:
 # 获取表格内容,是从第一行第一列是从1开始的,注意不要丢掉.value
 Data = table.cell(row=1,column=1).value
 print(Data)
 #获取所有表名
 sheet_names = wb.sheetnames
 print(sheet_names[0])
 ws = wb[(wb.sheetnames[0])]# index为0为第一张表#活动表表名
 print(wb.active.title)

最后在对表操作结束后需要表进行保存操作。

 wb.save('test.xlsx')

2. 写入CSV格式

csv文件格式是一种通用的电子表格和数据库导入导出格式。最近我调用RPC处理服务器数据时,经常需要将数据做个存档便使用了这一方便的格式。

python中有一个读写csv文件的包,直接import csv即可。利用这个python包可以很方便对csv文件进行操作,一些简单的用法如下。

 import csv
 list = [[1,2,3,4],[1,2,3,4],[5,6,7,8],[5,6,7,8]]
 with open( ' example1.csv', 'w' , newline=' ') as csvfile:
     spamwriter = csv.writer(csvfile,delimiter=',')
     for li in list:
      spamwriter.writerow([1,2,3,4])

csv模块读取文件时,需要以csv的阅读方式:

 import csv
 with open( 'example.csv', encoding='utf-8') as f:
     csv_reader = csv.reader(f)
     for row in csv_reader:
       print(row)

因为csv文件在默认情况下是以逗号作为分隔符的,当出现以其它符号作为分隔符时可以指定分隔符号进行读取。

 with open( ' example.csv', encoding='utf-8') as f:
 #通过指定delimiter的参数就可以指定分隔符
     reader = csv.reader(f, delimiter=', ')
     for row in reader:
       print(row)

csv格式还支持读写字典格式,我们直接来看它是如何使用的:

 #写入
 import csv
 with open( ' names.csv' , 'w') as csvfi1e:
   fie1dnames = ['first_name ', 'last_name ' ]
   writer = csv.Dictwriter(csvfile,fieldnames=fie1dnames)
   writer.writeheader()
   writer.writerow({ 'first_name ' : 'Baked', 'last_name ' : 'Beans '})
   writer.writerow({ 'first_name ' : 'Love1y'3
   writer.writerow({'first_name ' : 'wonderfu1','last_name ' : 'spam'})
 #读取
 import csv
 with open( ' names.csv', newline='') as csvfile:
   reader = csv.DictReader(csvfile)
   for row in reader:
     print(row['first_name '],row[ ' 1ast_name'])

3. 读写json格式

在requests模块从服务端获取的响应体,如果是json格式的数据可以直接response.json() 将数据以json格式保存下来。json格式与python中的字典格式非常相似,但json主要是一种保存数据的数据格式,我们在获取其内容时直接可以按照字典获取内容的格式来获取。这是在直接保存为json格式的情况下我们可以通过字典的索引方式来获取其具体内容。

如果从服务端返回的是字符串,那么就需要将字符串序列化为json格式,而将json数据变为字典类型的这个过程则称为反序列化。

 #读取json数据
 with open( ' data.json', 'r ', encoding='utf-8 ' ) as f :
 #反序列化,将json数据变为字典格式
 data = json. load(f)
 #打印数据
 print(data)
 print(data['name']

而对于反序列化只需要使用json.jumps()函数即可,在保存json数据的时候如果出现中文乱码,也就是将中文编译为字母加数字的格式,类似于:

 # filename : data.json
 { "name": "\u9743\u756f","shares": 100,"price" : 542.233}

只需要在json数据序列化时添加参数即可:

 json_str = json.dumps(data,ensure_ascii=False)

4. 总结

数据的类型有许多种,具体保存为哪种格式取决于我们具体的用途,如果对于大量数据我们可以保存为xlsx格式或者csv格式的,这两种格式对于数据的处理十分方便。如果有其他需求的,我们还可以将数据保存在数据库中,python连接数据库也十分方便。基础部分的爬虫就总结到这里,后续可能会更新一些 js解密、scrpy以及selenium等的爬虫手段。