在Python中,将网页上获取的数据和多张图片插入Excel可以通过以下步骤实现:
- 使用 requests 库获取网页内容。
- 使用 BeautifulSoup 解析网页,找到数据和图片的URL。
- 使用 requests 的 write() 方法将图片原始二进制数据储存本地(将图片下载到本地)。
- 使用 pandas 将数据转换为DataFrame,并用 to_excel() 方法将DataFrame写入Excel。
- 使用 openpyxl 的 load_workbook() 函数打开Excel文件,并获取对应的工作表。
- 使用 openpyxl 的 add_image() 方法将图片插入到特定的单元格。
由于Pandas DataFrame主要用于数据操作和分析,不支持向Excel文件中插入图片。因此需要引入openpyxl 或 xlsxwriter 库,提供了更多的 Excel 操作功能,包括插入图片。
一、安装Pillow库
使用Python处理图像,首先需要安装Pillow库,用于打开、操作和保存许多不同格式的图像文件。
缺少Pillow库,运行会报错“ImportError: You must install Pillow to fetch image objects”
使用命令pip install Pillow
或pip install -i https://pypi.org/simple Pillow
安装Pillow库。
C:\Users\admin>pip install Pillow
Defaulting to user installation because normal site-packages is not writeable
ERROR: Could not find a version that satisfies the requirement Pillow (from versions: none)
ERROR: No matching distribution found for Pillow
# 添加 -i 参数指定使用默认的Python包索引,可解决以上报错
C:\Users\admin>pip install -i https://pypi.org/simple Pillow
二、获取数据和图片,写入Excel文件
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import requests
from bs4 import BeautifulSoup
import pandas as pd
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
# 定义目标网页URL
url = "http://www.qichedaquan.com/index.php/auto"
# 发送HTTP GET请求
response = requests.get(url)
# 检查HTTP请求是否成功
if response.status_code == 200:
# 使用BeautifulSoup解析网页内容
soup = BeautifulSoup(response.content, "html.parser")
# 存储数据的列表
data_list = []
# 选择网页中所有需要解析的元素
tag_list = soup.select('.col-3 a')
# 从第二个元素开始遍历,提取所需信息
for tag in tag_list[1:]:
# 提取文本信息并去除空白符,容错处理不存在的<p>标签
text = tag.find('p').get_text(strip=True) if tag.find('p') else "Null"
# 提取链接地址
link_url = tag.get('href')
# 提取图片地址
img_tag = tag.find('img')
img_url = img_tag.get('src') if img_tag else "Null"
img_name = os.path.basename(img_url) # 获取下载图像的文件名称
img_path = os.path.join('downloaded_images', img_name) # 存储下载图像的文件路径
# 确保目录存在
os.makedirs(os.path.dirname(img_path), exist_ok=True)
# 从网站下载图片,并保存到本地路径
with open(img_path, 'wb') as f: # with open()打开一个文件,w代表写入,b代表二进制模式
f.write(requests.get(img_url).content) #.content属性获取原始二进制数据,write()写入文件对象中
# 将数据添加到列表
data_list.append({
'汽车名称': text,
'汽车链接': link_url,
'汽车图片链接': img_url,
'汽车图片': img_path
})
# 将列表转换为DataFrame
df = pd.DataFrame(data_list)
# 将DataFrame写入Excel,但不包含图片
excel_filename = '汽车大全.xlsx'
df.to_excel(excel_filename, sheet_name='汽车列表', index=False, engine='openpyxl')
# 加载Excel工作簿和工作表
wb = load_workbook(excel_filename)
ws = wb['汽车列表'] # 通过名称指定工作表
'''
# 创建一个新的工作簿和活动工作表
# 此处改用加载现有Excel工作簿load_workbook()函数,用以将图片插入已存在的Excel文件
wb = Workbook()
ws = wb.active # 获取活动工作表
'''
# 遍历DataFrame,并将图片插入到Excel中
for index, row in df.iterrows():
# 创建Image对象(参数是存储下载图像的文件路径)
img = Image(row['汽车图片'])
# 设置图片大小适应单元格(单位:像素)
img.width, img.height = 72, 48
'''
# 使用PIL库打开图片(需要引入包from PIL import Image as PilImage)
pil_image = PilImage.open(row['汽车图片'])
# 获取图片的尺寸
width, height = pil_image.size
#print(f'width:{width},height:{height}')
'''
# 设置行高以适应图片高度
''' 行高(点数)= 像素高度×72/DPI,Excel的默认打印分辨率是 96 DPI'''
ws.row_dimensions[index+2].height = (img.height * 72) / 96
# 计算单元格坐标
cell_coordinate = f'D{index + 2}'
# 将图片插入到Excel中对应的单元格
ws.add_image(img, cell_coordinate)
# 保存Excel文件
wb.save(excel_filename)
print('数据已保存到Excel文件。')
else:
# 打印请求失败的状态码
print(f'请求失败,状态码:{response.status_code}')
请注意:
- 代码中的图片插入逻辑假设Excel工作表的第一行是标题行,并且图片将从第二行开始插入。