爬虫-存储数据

EXCEL文件

openpyxl写文件

exce文件也被称为工作簿,其可以创建多个工作表。每个工作表是由很多个单元格组成。我们通过openpyxl来操作Excel文件。

安装

pip install openpyxl

要将内容写入Excel文件,首先要创建一个Excel表格,方法如下:

# 从 openpyxl 引入 Workbook(工作簿)类
from openpyxl import Workbook

# 通过 Workbook 类实例化一个工作簿
wb = Workbook()

使用openpyxl中的Workbook类实例化了一个工作簿,即创建了一个空的Excel文件。

from openpyxl import Workbook

wb = Workbook()
# 选择默认的工作表
sheet = wb.active
# 给工作表重命名
sheet.title = '8月考勤统计表'

前面也说了工作簿是由很多工作表组成的,通过wb.active选择了默认的工作表,title属性重命名了默认工作表。

# 往 A1 单元格写入小贝
sheet['A1'] = '小贝'

既然我们已经选择了工作表,那就应该往工作表中写入数据了,前面我们也说过,工作表是由很多单元格组成,我们上面就是往特定的单元格内写入数据。

上面我们是通过字典赋值的方式写入的。还可以传入一个列表,通过append()的方法一次性往工作表内写入数据。

# 写入一行数据
row = ['姓名', '出勤天数', '迟到次数']
sheet.append(row)

但在实际应用中,保存的数据肯定不止一行,这个时候我们通过for循环一行行写入。

data = [
  ['姓名', '出勤天数', '迟到次数'],
  ['小贝', 20, 5],
  ['闻闻', 22, 0]
]

# 写入多行数据
for row in data:
  sheet.append(row)

数据写完之后需要保存文件,使用wb.save("文件名.xlsx")

完整代码如下:

from openpyxl import Workbook

# 新建工作簿
wb = Workbook()
# 选择默认的工作表
sheet = wb.active
# 给工作表重命名
sheet.title = '考勤统计表'

data = [
  ['姓名', '出勤天数', '迟到次数'],
  ['小贝', 20, 5],
  ['闻闻', 22, 0]
]

# 写入多行数据
for row in data:
  sheet.append(row)

# 保存 Excel 文件
wb.save('考勤统计.xlsx')

openpyxl读文件

有写必有读,我们先直接看代码

from openpyxl import load_workbook

# 打开 Excel 文件
wb = load_workbook('考勤统计.xlsx')
# 选择考勤统计表这张工作表
sheet = wb['考勤统计表']
# 打印出所有工作表名称
print(wb.sheetnames)
# 输出:['考勤统计表']

# 打印出 A1 单元格的值
print(sheet['A1'].value)
# 输出:姓名

# 打印所有单元格的值
for row in sheet.rows:
  for cell in row:
    print(cell.value)
# 逐行输出:姓名 出勤天数 迟到次数 小贝 20 5 闻闻 22 0

我们以我们平时手动打开表格来理解这段代码:

  1. 首先要双击打开我们需要的表,python中使用load_workbook()方法来打开
  2. 打开表之后找到我们要找的sheet表,python中是通过wb["表名"]来获取,当然如果不知道有哪些表,我们可以通过sheetname来查看
  3. 找到了对应的表之后,我们就获取了有数据的单元格,因为数据有多行,我们需要一行行的获取,先遍历每一行,通过value属性访问

openpyxl 实战

之前我们爬取过豆瓣图书 Top 250 的数据,现在我们来用 openpyxl 将爬取的数据保存下来。为了使数据内容丰富一些,我稍微改动了一下之前爬取一页数据的代码,使它能获取图书的 书名评分 和 链接,具体代码如下:

import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

wb = Workbook()
sheet = wb.active
sheet.title = '豆瓣图书Top250'
# 写入表头
header = ['书名', '评分', '链接']
sheet.append(header)

headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'}
res = requests.get('https://book.douban.com/top250/', headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
# 通过 class 属性选中所有包含图书信息的整个 HTML 元素
items = soup.select('.item')
# 遍历每个元素,即遍历每本图书
for i in items:
  tag = i.select('div.pl2 a')[0] # 选中包含书名、书籍链接的 a 元素
  rating = i.select('.rating_nums')[0].text # 书籍评分
  name = tag['title'] # 书名
  link = tag['href'] # 书籍链接
  # 写入一行数据
  row = [name, rating, link]
  sheet.append(row)
  print(name, rating, link)

# 保存为 豆瓣.xlsx
wb.save('豆瓣.xlsx')

 以下为结果

书名 评分 链接
红楼梦 9.6 https://book.douban.com/subject/1007305/
活着 9.4 https://book.douban.com/subject/4913064/
1984 9.4 https://book.douban.com/subject/4820710/
哈利·波特 9.7 https://book.douban.com/subject/24531956/
三体全集 9.5 https://book.douban.com/subject/6518605/
百年孤独 9.3 https://book.douban.com/subject/6082808/
9.3 https://book.douban.com/subject/1068920/
动物农场 9.3 https://book.douban.com/subject/2035179/
三国演义(全二册) 9.3 https://book.douban.com/subject/1019568/
房思琪的初恋乐园 9.2 https://book.douban.com/subject/27614904/
福尔摩斯探案全集(上中下) 9.3 https://book.douban.com/subject/1040211/
白夜行 9.2 https://book.douban.com/subject/10554308/
小王子 9.1 https://book.douban.com/subject/1084336/
安徒生童话故事集 9.3 https://book.douban.com/subject/1046209/
天龙八部 9.2 https://book.douban.com/subject/1255625/
撒哈拉的故事 9.2 https://book.douban.com/subject/1060068/
呐喊 9.2 https://book.douban.com/subject/1449351/
邓小平时代 9.3 https://book.douban.com/subject/20424526/
悉达多 9.3 https://book.douban.com/subject/26980487/
杀死一只知更鸟 9.2 https://book.douban.com/subject/6781808/
明朝那些事儿(1-9) 9.2 https://book.douban.com/subject/3674537/
失踪的孩子 9.2 https://book.douban.com/subject/30172069/
新名字的故事 9.2 https://book.douban.com/subject/26986954/
沉默的大多数 9.1 https://book.douban.com/subject/1054685/
野草 9.5 https://book.douban.com/subject/1915958/

CSV 

CSV 全称 Comma-Separated Values(逗号分隔值),它是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用

CSV 写文件

直接看代码

import csv

with open('考勤统计表.csv', 'w', newline='') as file:
  csv_writer = csv.writer(file)
  rows = [
    ['姓名', '出勤天数', '迟到次数'],
    ['小贝', 20, 5],
    ['闻闻', 22, 0]
  ]
  for row in rows:
    csv_writer.writerow(row)

首先还是导入 csv 库,接着用 w 模式(写入模式)新建一个 csv 文件,然后将得到的 file 对象传递给 csv.writer() 方法进行处理,得到一个可写入对象,接下来就可以用它来写入 csv 文件了。

和 openpyxl 类似,csv 文件也能逐行写入,openpyxl 调用的是 append() 方法,而 csv 调用的是 writerow() 方法,将表格的一行内容按顺序放到列表中作为参数传进去即可。

csv 还提供了一个更加快捷的写入多行内容的方法——writerows(),通过该方法不再需要使用 for 循环,直接将多行数据的二维列表传进去即可

import csv

with open('考勤统计表.csv', 'w', newline='') as file:
  csv_writer = csv.writer(file)
  rows = [
    ['姓名', '出勤天数', '迟到次数'],
    ['小贝', 20, 5],
    ['闻闻', 22, 0]
  ]
  csv_writer.writerows(rows)

CSV 读文件

import csv

with open('考勤统计表.csv', newline='') as file:
  csv_reader = csv.reader(file)
  for row in csv_reader:
    print(row)

首先通过 import csv 导入 csv 库,然后用 open() 函数打开 csv 文件,将得到的 file 对象传入 csv.reader() 方法进行处理,最终得到一个可读取对象。我们可以用 for 循环遍历得到的可读取对象 csv_reader 获取 csv 文件中的每一行数据。

注意:open() 函数中的第二个参数 newline='' 是为了让文件内容中的换行符能被正确解析,建议在用 csv 处理文件时都加上这个参数。

CSV 实战

直接上代码

import requests
import csv
from bs4 import BeautifulSoup


with open('豆瓣.csv', 'w', newline='') as file:
  csv_writer = csv.writer(file)
  header = ['书名', '评分', '链接']
  csv_writer.writerow(header)
  # 注意代码的层级关系,不要搞错缩进哦!
  headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'}
  res = requests.get('https://book.douban.com/top250/', headers=headers)
  soup = BeautifulSoup(res.text, 'html.parser')
  # 通过 class 属性选中所有包含图书信息的整个 HTML 元素
  items = soup.select('.item')
  # 遍历每个元素,即遍历每本图书
  for i in items:
    tag = i.select('div.pl2 a')[0] # 选中包含书名、书籍链接的 a 元素
    rating = i.select('.rating_nums')[0].text # 书籍评分
    name = tag['title'] # 书名
    link = tag['href'] # 书籍链接
    row = [name, rating, link]
    csv_writer.writerow(row)
    print(name, rating, link)

相关推荐

  1. 爬虫-存储数据

    2024-07-17 19:00:05       23 阅读
  2. Python爬虫数据存储

    2024-07-17 19:00:05       30 阅读
  3. Python爬虫之关系型数据库存储#5

    2024-07-17 19:00:05       39 阅读
  4. Python爬虫之非关系型数据库存储#5

    2024-07-17 19:00:05       54 阅读
  5. 数据存储-文件存储

    2024-07-17 19:00:05       29 阅读
  6. Python爬虫存储库安装

    2024-07-17 19:00:05       47 阅读
  7. 爬虫:爬取新闻内容及图片,存入数据库

    2024-07-17 19:00:05       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 19:00:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 19:00:05       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 19:00:05       58 阅读
  4. Python语言-面向对象

    2024-07-17 19:00:05       69 阅读

热门阅读

  1. Windows的包管理器Chocolatey

    2024-07-17 19:00:05       22 阅读
  2. 渗透测试前景怎么样

    2024-07-17 19:00:05       22 阅读
  3. 区块链技术的应用场景和优势

    2024-07-17 19:00:05       19 阅读
  4. 摘要算法介绍

    2024-07-17 19:00:05       23 阅读
  5. 如何规避苹果开发者账户关联

    2024-07-17 19:00:05       22 阅读
  6. golang笔记-流程控制

    2024-07-17 19:00:05       20 阅读
  7. js数组去重(4种方法)

    2024-07-17 19:00:05       19 阅读
  8. Python列表基础与高级应用详解

    2024-07-17 19:00:05       24 阅读