基于 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/194597.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的学生疫情信息管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Ubuntu 22.04 LTS ffmpeg mp4 gif 添加图片水印

ffmpeg编译安装6.0.1,参考 Ubuntu 20.04 LTS ffmpeg gif mp4 互转 许编译安装ffmpeg ;解决gif转mp4转换后无法播放问题-CSDN博客 准备一个logo MP4添加水印 ffmpeg -i 2.mp4 -vf "movielogo.png[watermark];[in][watermark]overlayx10:y10[out]&…

大功率电源芯片WD5030L

电源管理芯片作为现代电子设备中最关键的元件之一,直接影响着设备的性能和效率。而大功率电源芯片作为电源管理芯片中的一种,其性能和应用领域更加广泛。本文将介绍一款具有宽VIN输入范围、高效率和多种优良性能的大功率电源芯片WD5030L,并探…

通付盾Web3专题 | KYT/AML:Web3合规展业的必要条件

与传统证券一样,基于区块链技术发展出来的虚拟资产交易所经历了快速发展而缺乏有效监管的行业早期。除了科技光环加持的各种区块链项目方、造富神话之外,交易所遭到黑客攻击、内部偷窃作恶、甚至经营主体异常而致使投资人血本无归的案例亦令人触目惊心。…

STM32 I2C详解

STM32 I2C详解 I2C简介 I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线 两根通信线: SCL(Serial Clock)串行时钟线,使用同步的时序,降低对硬件的依赖,同时同步的时序稳定…

udp多点通信-广播-组播

单播 每次只有两个实体相互通信,发送端和接收端都是唯一确定的。 广播 主机之间的一对多的通信所有的主机都可以接收到广播消息(不管你是否需要)广播禁止穿过路由器(只能做局域网通信)只有UDP可以广播广播地址 有效网络号全是1的主机号 192.1…

酷开系统 酷开科技,将家庭娱乐推向新高潮

在当今数字化时代,家庭娱乐已经成为人们日常生活中不可或缺的一部分。如果你厌倦了传统的家庭娱乐方式,想要一种全新的、充满惊喜的娱乐体验,那么,不妨进入到酷开科技的世界,作为智能电视行业领军企业,酷开…

Dubbo协议详解

前言特点应用场景Dubbo协议示例Dubbo协议的不足拓展 前言 Dubbo协议是一种高性能、轻量级的开源RPC框架,主要设计目的是解决分布式系统中服务调用的一些常见问题,例如服务负载均衡、服务注册中心、服务的远程调用等。它支持多种语言,例如Jav…

Day10—SQL那些事(特殊场景的查询)

文章目录 1、只想查一个字段却不得不左连接好多张表2、左连接的时候只想取最后一条数据 1、只想查一个字段却不得不左连接好多张表 只想查一个字段却不得不左连接好多张表,而且因为左连接的表太多还导致查出来的数据重复 原先的sql SELECTsph.po_num,chh.visa_ex…

向量以及矩阵

0.前言 好了那我们新的征程也即将开始,那么在此呢我也先啰嗦两句,本篇文章介绍数学基础的部分,因为个人精力有限我不可能没一字一句都讲得非常清楚明白,像矩阵乘法之类的一些基础知识我都是默认你会了(还不会的同学推…

Nas搭建webdav服务器并同步Zotero科研文献

无需云盘,不限流量实现Zotero跨平台同步:内网穿透私有WebDAV服务器 文章目录 无需云盘,不限流量实现Zotero跨平台同步:内网穿透私有WebDAV服务器一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zote…

认识Tomcat

文章目录 什么是tomcat?tomcat的使用tomcat的下载tomcat的目录结构tomcat的启动在tomcat上部署页面通过浏览器访问部署的页面 学习servlet的原因 什么是tomcat? 盖棺定论:Tomcat是一个HTTP服务器。 我们接下来要长期学习的东西都是关于前后…

Python框架篇(2):FastApi-参数接收和验证

提示: 如果想获取文章中具体的代码信息,可在微信搜索【猿码记】回复 【fastapi】即可。 1.参数接收 1.1 路径参数(不推荐) 1.代码清单 在app/router下,新增demo_router.py文件,内容如下: from fastapi import APIRouterrouter APIRouter( prefix&qu…

SpringCloud微服务:Nacos的集群、负载均衡、环境隔离

目录 集群 在user-service的yml文件配置集群 启动服务 负载均衡 order-service配置集群 设置负载均衡 当本地集群的服务挂掉时 访问权重 环境隔离 1、Nacos服务分级存储模型 一级是服务,例如userservice 二级是集群,例如杭州或上海 …

【自动化测试】基于Selenium + Python的web自动化框架!

一、什么是Selenium? Selenium是一个基于浏览器的自动化工具,她提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid:  1、Selenium IDE&…

设计基于STM32F103C8T6微控制器的巡线小车

巡线小车是一种能够在一条预定线追踪路径的小车,广泛应用于工业自动化、物流仓储、智能家居等领域。本设计将使用STM32F103C8T6微控制器来实现一个基础的巡线小车。 硬件组成:1. STM32F103C8T6微控制器开发板:作为巡线小车的核心控制器&…

开源与闭源:数字化时代的辩论与未来走向

在当今的数字化时代,关于开源和闭源软件的辩论一直是技术界的热门话题。 特斯拉CEO马斯克最近也加入了这场辩论,公开表示OpenAI不应该闭源,而他自己的首款聊天机器人将选择开源。 这引发了人们对开源与闭源软件的进一步思考:开源是…

关于数据mysql ->maxwell->kafka的数据传输

个人名片: 🐅作者简介:一名大三在校生,热爱生活,爱好敲码! \ 💅个人主页 🥇:holy-wangle ➡系列内容: 🖼️ tkinter前端窗口界面创建与优化 &…

基于ssm+vue员工工资管理系统

基于ssmvue员工工资管理系统 摘要 随着信息技术的不断发展,各行各业对于高效管理和利用数据的需求也日益增长。员工工资管理系统作为企业管理中的一个重要组成部分,对于实现工资信息的精确计算、及时发放和有效管理具有重要意义。本文基于SSM&#xff08…

asp.net core EF Sqlserver

一、EF CORE的使用 1、使用NuGet来安装EF CORE 使用程序包管理器控制台,进行命令安装 //安装 Microsoft.EntityFrameworkCoreInstall-Package Microsoft.EntityFrameworkCore //安装 Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityF…