当前位置: 首页 > news >正文

基于 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,有很高的并发性。


#!/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:urlReturns:base64_bytes"""response = requests.get(url)image_bytes = response.contentbase64_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.contentreturn image_bytesdriver = 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)

相关文章:

基于 selenium 实现网站图片采集

写在前面 有小伙伴选题,简单整理理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对…...

vue3相关内容

ref声明/赋值 操作基本类型数据 string number // 引入方法 import {ref} from vue // 声明变量 const name ref(A) // 修改值 name.value Breactive声明/赋值 操作引用类型数据 array object proxy不能直接赋值,会破坏响应式对象 // 引入方法 import {reacti…...

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(七):FreeRTOS移植

前言: 一般的GUI工程都需要一个操作系统,可能是linux,重量级的,也可能是FreeRTOS,轻量级的。 一句话理解那就是工程就是FreeRTOS task任务的集合。 一个main函数可以看到大框架: 很显然,除了第一个是硬件配置的初始化,中间最重要的部分就是要创建任务,把AWTK的应用…...

《洛谷深入浅出进阶篇》P1995 程序自动分析——并查集,离散化

上链接:P1955 [NOI2015] 程序自动分析 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1955 上题干: 首先给你一个整数t,代表t次操作。 每一次操作包含以下内容: 1.给你一个整数n,让…...

基于单片机的自动循迹小车(论文+源码)

1.系统设计 此次基于单片机的自动循迹小车的设计系统,结合循迹模块来共同完成本次设计,实现小车的循迹功能,其其整体框架如图2.1所示。其中,采用STC89C52单片机来作为核心控制器,负责将各个传感器等模块链接起来&…...

linux系统中安装python到指定目录

Linux系统中安装python 下载Python源码包 根据服务器系统和需要的Python版本,在Python官网下载对应的Python源码包。 安装依赖(需要权限) yum install gcc gcc-c patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel…...

分布式事务 - seata安装

分布式事务 - seata 一、本地事务与分布式事务 1.1、本地事务 本地事务,也就是传统的单机事务。在传统数据库事务中,必须要满足四个原则(ACID)。 1.2、分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构…...

CentOS to 浪潮信息 KeyarchOS 迁移体验与优化建议

浪潮信息KeyarchOS简介 KeyarchOS即云峦操作系统(简称KOS), 是浪潮信息研发的一款面向政企、金融等企业级用户的 Linux 服务器操作系统。它基于Linux内核、龙蜥等开源技术,支持x86、ARM 等主流架构处理器,其稳定性、安全性、兼容性和性能等核心能力均已…...

Go解析soap数据和修改其中数据

一、解析soap数据 package main import ("fmt" "encoding/xml" ) type Envelope struct { XMLName xml.Name Header Header } type Header struct { XMLName xml.Name xml:"Header" Security Security xml:"Security" } type Secu…...

LeetCode98. Validate Binary Search Tree

文章目录 一、题目二、题解 一、题目 Given the root of a binary tree, determine if it is a valid binary search tree (BST). A valid BST is defined as follows: The left subtree of a node contains only nodes with keys less than the node’s key. The right sub…...

【LeetCode】206. 反转链表

206. 反转链表 难度:简单 题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输…...

飞天使-通过GET 和POST进案例演示

文章目录 GETPOST GET def index(request):# 在url中获取学号sno request.GET.get("sno", None)print("学号为:",sno)# 判断学号如果有值,执行查询if sno:results get_student_by_sno(sno)# 展示在页面return render(request, ind…...

【MySql】12- 实践篇(十)

文章目录 1. 为什么临时表可以重名?1.1 临时表的特性1.2 临时表的应用1.3 为什么临时表可以重名?1.4 临时表和主备复制 2. MySql内部临时表使用场景2.1 union 执行流程2.2 group by 执行流程2.3 group by 优化方法 -- 索引2.4 group by 优化方法 -- 直接排序 3. Me…...

<C++> 反向迭代器

我们知道正向迭代器的设计:begin迭代器指向第一个数据,end迭代器指向最后一个数据的下一个位置 。移向下一个数据,解引用得到数据的值,并根据容器储存方式的不同,容器有不同类型的迭代器。 注意:rbegin迭代…...

【EI会议征稿】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024) 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024&#…...

格力报案称“高管遭自媒体侮辱诽谤”

我是卢松松,点点上面的头像,欢迎关注我哦! 王自如的一番话引来了众多围攻,格力已报警,高管遭到侮辱诽谤。这应该是近年来少见的大企业和网络大v之间公开翻脸互撕的场景了! 就在今天格力就高管遭自媒体侮辱诽谤报案。…...

HBase之Compaction

目录 Compaction触发条件相关参数 文件选取策略ExploringCompactionPolicy常见优化 Compaction 随着memstore的不断flush,storefile的数量将会不断增加。compaction将通过合并storefile来减少文件数量,并提高读性能。conpaction以store为单位 Compacti…...

设计模式之结构型模式

这些模式关注对象之间的组合和关联方式,以便形成更大的结构和功能。 适配器模式(Adapter Pattern)桥接模式(Bridge)装饰器模式(Decorator)组合模式(Composite)外观模式&a…...

centOs 6.10 编译 qt 5.15.11

安装依赖库 xcb 依赖库 qt xcb 需要的依赖 如何要用 x11, 就要在编译的时候加上 -xcb 选项,就要安装 xcb 相关的库。 到时可以在 config.log 文件查看,缺少哪个库就安装哪个。 下面是我手动安装的库和对应版本: xcb-proto-1.14.tar.gz x…...

Redis对象的数据结构及其原理汇总

本文首发于公众号:Hunter后端 原文链接:Redis对象的数据结构及其底层实现原理汇总 当我们被问到 Redis 中有什么数据结构,或者说数据类型,我们可能会说有字符串、列表、哈希、集合、有序集合。 其实这几种数据类型在 Redis 中都由…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

大话软工笔记—需求分析概述

需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

【JavaEE】-- HTTP

1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

【AI学习】三、AI算法中的向量

在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​:Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...