基于 selenium 实现网站图片采集

写在前面


  • 有小伙伴选题,简单整理
  • 理解不足小伙伴帮忙指正

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ------赫尔曼·黑塞《德米安》


采集原理

一般情况下可以通过 selenium 来批量获取图片,定位元素,获取URL ,逻辑相对简单:

部分页面可能存在 翻页,懒加载的情况,一般使用 selenium 基本可以解决(下文 Demo 只涉及了 懒加载场景 )

采集图片实质上是采集图片对应的uri ,图片 URI 一般有三种:

  • 一种为返回可预览的图片,报文类型为 image/jpeg,是一个 JPEG 图像文件,一般uri 后缀为图片名称后缀
  • 一种为返回可以直接下载的图片,报文类型为 binary/octet-stream,是一种二进制数据的 MIME 类型。
  • 最后一种为直接返回 b64 编码的方式,

所以实际编码中需要考虑这三种情况,对于 b64 编码可以直接保存,对应 其他两两种 uri ,考虑转化字节或者 b64 编码下载

需要注意的问题

  1. selenium 的版本问题,3 版本的和 4 版本 部分 方法差距较大,在实际编码中需要注意
  2. 图片版权问题,是否允许直接使用
  3. 考虑 IP 流量检测,如果同一IP 获取,会涉及大量的 IO 操作,考虑代理池
  4. 逻辑方面实际处理中,可能存在部分 广告图片,需要结合网站实际需求进行处理
  5. 如果对图片有要求,可以适当的添加一些图片大小,模糊度的的过滤条件

下面为一个简单的脚本,以百度图库为 Demo,在实际的生产项目中,可以使用 ASGI 相关支持异步的 Web 框架处理 ( 比如 tornado 等),基于事件循环,不会阻塞 网络IO,有很高的并发性。

py 复制代码
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File    :   dow_img_file.py
@Time    :   2023/11/15 20:53:40
@Author  :   Li Ruilong
@Version :   1.0
@Contact :   liruilonger@gmail.com
@Desc    :   批量图片采集
"""

# here put the import lib
import requests
import base64
import pandas as pd
import time
import io
import uuid
from selenium import webdriver
from selenium.webdriver.common.by import By
from PIL import Image



"""


"""


def get_img_url_base64(url):
    """
    @Time    :   2023/05/29 21:50:42
    @Author  :   liruilonger@gmail.com
    @Version :   1.0
    @Desc    :   图片 url 解析为 base64 编码
                 Args:
                   url
                 Returns:
                   base64_bytes
    """
    response = requests.get(url)
    image_bytes = response.content
    base64_bytes = base64.b64encode(image_bytes)
    return base64_bytes.decode('utf-8')


def save_base64_image(base64_data, output_file):
    """
    @Time    :   2023/11/15 22:17:15
    @Author  :   liruilonger@gmail.com
    @Version :   1.0
    @Desc    :   保存 b64 编码为 图片
    """
    
    # 解析 Base64 编码字符串
    format, data = base64_data.split(";base64,")
    image_format = format.split("/")[-1]

    # 解码 Base64 数据
    image_data = base64.b64decode(data)

    # 将字节数据读取为图像
    image = Image.open(io.BytesIO(image_data))
    image = image.convert("RGB")
    # 保存图像为文件
    image.save(output_file, image_format)


def get_img_url_byte(url):
    """
    @Time    :   2023/10/15 23:49:10
    @Author  :   liruilonger@gmail.com
    @Version :   1.0
    @Desc    :   图片 url 解析为 字节
    """
    response = requests.get(url)
    image_bytes = response.content
    return image_bytes


driver = webdriver.Chrome()

driver.get('https://image.baidu.com/')


driver.find_element(By.XPATH, "//input[@id='kw']").send_keys("K8s")
time.sleep(3)
driver.find_element(By.XPATH, "//input[@class='s_newBtn']").click()
time.sleep(5)

# 懒加载数据处理,点击 10 次加载更多
for page in range(0,2):
    # 跳转的页底部,触发懒加载
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(2)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(2)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(3)

img_elements = driver.find_elements(By.TAG_NAME,'img')
time.sleep(1) 


# 对采集处理数据进行加工
imgs = []
data = {
        "URI":[],
    }
for img_element in img_elements:
    img_id = img_element.get_attribute('id')
    img_src = img_element.get_attribute('src')
    if img_src is not None and len(img_src) > 10:
        imgs.append((img_id,img_src))
        data['URI'].append(img_src)



# 这里可以根据实际清理输出表格
df = pd.DataFrame(data)
file_name = "img_url"
df.to_csv(f'{file_name}.csv', index=False) 

# 批量下载图片
for img in  imgs:
    if 'base64' in img[1]:
        save_base64_image(img[1],f"{str(uuid.uuid4()).replace('-', '')}.jpg")
    else:    
        image_bytes = get_img_url_byte(img[1])
        image = Image.open(io.BytesIO(image_bytes))
        image = image.convert("RGB")
        image.save(f"{str(uuid.uuid4()).replace('-', '')}.jpg")

测试结果

下载图片

保存的 图片 URI


© 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

相关推荐
程序员小远13 天前
自动化测试基础知识总结
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
LT101579744414 天前
2026年Web自动化测试工具选型指南:多浏览器兼容解决方案
前端·测试工具·自动化
程序员三藏14 天前
Web自动化测试详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
深蓝电商API14 天前
Selenium 5.0 全新架构解析:值得升级吗?
爬虫·selenium
专业机床数据采集14 天前
基于 Wireshark 抓包逆向设备通信协议,并用 C# UDP协议跨平台 实现宝元数控程序列表读取、上传、下载和删除
网络·测试工具·wireshark·程序传输·宝元数控·dnc·数控程序传输
程序员龙叔14 天前
从 0 开始学习 AI 测试 - 从接口测试来教你如何用 AI 来生成自动化测试代码
自动化测试·软件测试·python·软件测试工程师·测试工具·性能测试·ai测试
Saniffer_SH14 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
川石课堂软件测试14 天前
APP自动化测试|高级手势操作&toast操作
css·功能测试·测试工具·microsoft·fiddler·单元测试·harmonyos
LT101579744415 天前
2026年开源自动化测试工具选型指南:功能与适用场景解析
测试工具·开源·自动化