【Python爬虫】抓取网络元素和图片到Excel

在Python中,将网页上获取的数据和多张图片插入Excel可以通过以下步骤实现:

  1. 使用 requests 库获取网页内容。
  2. 使用 BeautifulSoup 解析网页,找到数据和图片的URL。
  3. 使用 requests 的 write() 方法将图片原始二进制数据储存本地(将图片下载到本地)。
  4. 使用 pandas 将数据转换为DataFrame,并用 to_excel() 方法将DataFrame写入Excel。
  5. 使用 openpyxl 的 load_workbook() 函数打开Excel文件,并获取对应的工作表。
  6. 使用 openpyxl 的 add_image() 方法将图片插入到特定的单元格。

由于Pandas DataFrame主要用于数据操作和分析,不支持向Excel文件中插入图片。因此需要引入openpyxl 或 xlsxwriter 库,提供了更多的 Excel 操作功能,包括插入图片。

一、安装Pillow库

使用Python处理图像,首先需要安装Pillow库,用于打开、操作和保存许多不同格式的图像文件。
缺少Pillow库,运行会报错“ImportError: You must install Pillow to fetch image objects”

使用命令pip install Pillowpip 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工作表的第一行是标题行,并且图片将从第二行开始插入。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容