【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工作表的第一行是标题行,并且图片将从第二行开始插入。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容