Python实现批量图片下载及去重处理
背景
在爬虫应用开发中,常常需要批量下载图片,并对图片进行去重处理。Python 是一种非常流行的编程语言,也是开发爬虫应用的首选,本文将介绍如何使用 Python 下载图片,并对下载的图片进行去重处理。
内容
首先,我们需要使用 Python 中的 Requests 库来下载图片,并使用 OS 库来创建保存图片的文件夹。下载图片后,我们可以使用 hashlib 库对图片的内容做哈希处理,并将处理后的哈希值作为图片的唯一识别标志,以便进行去重处理。在对图片进行去重处理时,我们需要将下载的图片与已有的图片进行比对,可以使用字典或集合等数据结构来存储已有图片的哈希值,以便查找和比对。在所有的图片下载完成后,我们可以将下载的图片的文件名或哈希值保存到本地文本文件中,以备后续查看或处理。
一些好看的动漫api接口:https://blog.csdn.net/likepoems/article/details/123924270
https://img.r10086.com/
代码
1、爬取图片代码
# -*- coding: utf-8 -*-
# @Time : 2023/3/30 13:56
# @Author : 南宫乘风
# @Email : 1794748404@qq.com
# @File : main.py
# @Software: PyCharm
import os
import requests
from time import sleep# https://img.r10086.com/
# https://blog.csdn.net/likepoems/article/details/123924270def download_images(dir_path, file_prefix, num_images):"""循环访问接口并保存图片到指定目录dir_path:图片保存的目录file_prefix:保存的文件名前缀num_images:需要下载的图片数量"""if not os.path.exists(dir_path):os.makedirs(dir_path)# 设置请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/58.0.3029.110 Safari/537.36 '}for i in range(num_images):response = requests.get('https://api.r10086.com/img-api.php?type=原神横屏系列1', headers=headers)if response.status_code == 200:# 构造文件名file_name = os.path.join(dir_path, f'{file_prefix}_{i}.jpg')# 保存图片到本地文件with open(file_name, 'wb') as f:f.write(response.content)print(file_name + " 下载完成")else:print(f'获取图片失败,状态码:{response.status_code}')sleep(1)# 示例
if __name__ == '__main__':dir_path = 'dongman'file_prefix = 'image'num_images = 1000download_images(dir_path, file_prefix, num_images)
2、图片去重
原理:MD5 是一种常用的哈希算法,它可以将任意长度的输入(比如一个字符串或者一个文件)转换成一个 128 比特长度的输出,输出值通常表示为一个 32 位的十六进制数字串。而对于任意输入的变化,其产生的输出也会有所不同,因此可以将 MD5 值作为唯一的识别标志来去重。在 Python 中,我们可以使用 hashlib 库中的 md5 函数来生成 MD5 值。
流程:其具体实现流程如下:
- 导入 hashlib 库。
- 定义与图片相关的 path、filename 和 filesize 等变量,使用 os.path 库中的函数处理路径和文件名。
- 对图片的二进制数据使用 hashlib.md5() 生成 MD5 值。
- 将生成的 MD5 值转换为字符串格式,去除无用字符。
- 使用集合或字典等数据结构存储已有图片的 MD5 值,在遍历待下载的图片时,判断其对应的 MD5 值是否已经存在于集合或字典中,若存在则说明图片已下载过,不再重复下载;否则可以将该图片下载下来,并将其对应的 MD5 值加入到已有图片集合中。
- 下载图片后,将其文件名或 MD5 值存储到本地文本文件中,便于后续查看或处理。
上述流程基本描述了使用 MD5 值去重的具体实现过程,其中还需结合具体应用场景进行优化和改进。
import os
import shutil
import hashlibdef get_md5(file):"""计算文件的MD5值"""if not os.path.isfile(file):return Nonewith open(file, 'rb') as f:md5 = hashlib.md5()md5.update(f.read())return md5.hexdigest()def find_duplicate_images(dir_path):"""查找重复图片"""all_images = []md5_list = []delete_list = []# 遍历整个目录,将所有图片的路径保存到一个列表中for root, dirs, files in os.walk(dir_path):for file in files:if file.endswith('.jpg') or file.endswith('.png'):all_images.append(os.path.join(root, file))# 对于每个图片,计算它的MD5值,并将MD5值和路径保存到两个列表中for image in all_images:md5 = get_md5(image)if md5 is not None:md5_list.append(md5)else:delete_list.append(image)# 判断MD5值列表中是否有重复的值,如果有,则说明该图片是重复图片,将其路径保存到一个删除列表中for i in range(len(md5_list)):for j in range(i + 1, len(md5_list)):if md5_list[i] == md5_list[j]:delete_list.append(all_images[j])# 遍历删除列表,将其中的图片移动到目标目录中if not os.path.exists(target_dir):os.makedirs(target_dir)for image in delete_list:try:shutil.move(image, os.path.join(target_dir, os.path.basename(image)))print('已移动重复文件:', image)except Exception as e:print('移动失败:%s,错误:%s' % (image, str(e)))print('重复图片搜索完成,共找到%d个重复文件!' % len(delete_list))# 示例
if __name__ == '__main__':# 需要移动重复图片的目标目录# target_dir设置全局变量global target_dirtarget_dir = 'repeat_image'dir_path = 'dongman'find_duplicate_images(dir_path)
相关文章:

Python实现批量图片下载及去重处理
背景 在爬虫应用开发中,常常需要批量下载图片,并对图片进行去重处理。Python 是一种非常流行的编程语言,也是开发爬虫应用的首选,本文将介绍如何使用 Python 下载图片,并对下载的图片进行去重处理。 内容 首先&…...

【QA】Python代码调试之解决Segmentation fault (core dumped)问题
Python代码调试之解决Segmentation fault 问题 问题描述排查过程1. 定位错误,2. 解决办法 参考资料 问题描述 Python3执行某一个程序时,报Segmentation fault (core dumped)错,且没有其他任何提示,无法查问题。 Segmentation fa…...
C++ 迭代器之旅(Journey of Iterators)
C 迭代器之旅(Journey of Iterators) 一、引言(Introduction)C Iterator模板库简介(Overview of C Iterator Template Library)Iterator的重要性和作用(The Importance and Role of Iterators&a…...

使用全球融合CDN的10大优势
根据预估,今年的全球内容交付网络(CDN)市场预计将达到424亿美元。而由于移动应用程序的激增和人工智能尤其是ChatGPT等相关领域的快速发展将进一步带来CDN市场的快速增长,可以说全球CDN的黄金时代才刚开始。 融合CDN和多CDN战略是…...

前端学习:HTML图像、表格、列表
目录 图像 一、图像标签和源属性(Src) 二、替换文本属性(Alt) 三、设置图片样式基本属性 四、图像标签 表格 一、标签 补充: 二、表格的表头 三、表格常用标签和属性 标签 属性 列表 一、无序列表 二、有序列表 三、定义列表 四、列表常用标签属性 图像 一、…...

202305读书笔记|《因思念而沉着》——任何赞美都是身外之物唯自由可随身携带
《因思念而沉着》作者巴哑哑,忘了是什么时候加入的书架,昨天下班地铁上读完的书。是美的! 部分节选如下: 羽叶茑萝举着熄灭的花青色的小枣落了一地所以哭泣沾染上了你的脸 在没落下 当我们开始生活 就是开始患上了眼疾你独自悲伤…...

M1 M2上能安装上Autocad 2024 Mac 中文版吗 autocad m1 m2版本有啦 终于支持Ventura 13x了
AutoCAD是一款强大的工具,适合于各种领域的设计和绘图。它具有二维图形和三维建模功能、多种文件格式支持、自定义命令和样式、批处理和脚本等特点,可以帮助用户实现高质量的设计和建模。同时,还支持云端存储和共享,方便用户随时随…...

【题解】P4055 [JSOI2009] 游戏
link 题目大意 题目说得比较清楚。 题解 前置知识:二分图最大匹配、基础博弈论。 每个点只能走一次的四联通点阵,可以想到二分图匹配。 将其套路地奇偶分点,相邻两点连边(显然不能为 #)。 先求一个最大匹配。 …...
P1020 [NOIP1999 普及组] 导弹拦截
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统…...

Makefile学习
什么是Makefile 使用 GCC 编译器在 Linux 进行 C 语言编译,通过在终端执行 gcc 命 令来完成 C 文件的编译,如果我们的工程只有一两个 C 文件还好,需要输入的命令不多,当文件有几十、上百甚至上万个的时候用终端输入 GCC 命令的方…...

2.4 随机变量函数的分布
学习目标: 学习随机变量函数的分布,我会采取以下步骤: 熟悉随机变量的基本概念和分布:在学习随机变量函数的分布之前,需要先掌握随机变量的基本概念和分布,包括离散型随机变量和连续性随机变量的概率密度…...
数据结构【一】:前缀表达式与后缀表达式的区别
在早期计息机系统中,由于没有括号规定运算顺序,因此,依靠出栈和入栈两种方式,限定元素和符号之间的关系确定了前缀表达式和后缀表达式两种运算方式,中缀表达式即为普通的运算表达式;注意,在栈结…...
搭建 PostgreSQL
端口:5432 代理备份端口:6432 下载 postgresql-15.0-1-windows-x64 乱码显示 配置环境变量 PGDATA数据目录位置 找到postgresql.conf文件, 修改参数 lc_messagesUTF8 max_connections 1000 shared_buffers4GB work_mem8MB 问题:…...
Nmap入门到高级【第四章】
预计更新Nmap基础知识 1.1 Nmap简介和历史 1.2 Nmap安装和使用方法 1.3 Nmap扫描技术和扫描选项 Nmap扫描技术 2.1 端口扫描技术 2.2 操作系统检测技术 2.3 服务和应用程序检测技术 2.4 漏洞检测技术 Nmap扫描选项 3.1 扫描类型选项 3.2 过滤器选项 3.3 探测选项 3.4 输出选项…...
c++正则表达式及其使用,超级详细
文章目录 概述正则表达式语法正则表达式操作std::regex_matchstd::regex_replacestd::regex_search 实例匹配邮箱替换 HTML 标签搜索 URL 总结 概述 正则表达式是一种用于匹配字符串的工具,可以在文本中查找特定的模式,并且可以快速地对字符串进行搜索和…...

【LeetCode: 剑指 Offer II 099. 最小路径之和 | 暴力递归 | DFS =>记忆化搜索=>动态规划】
🍎作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎 🍎座右…...
Python OpenCV 计算机视觉:6~7
原文:OpenCV Computer Vision with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,你最…...

LabView中数组的使用2-1
在LabView中,数组用来管理相同类型的数据。 1 在前面板中创建数组 1.1 创建空数组 在前面板中创建数组时,首先在前面板中点击鼠标右键,弹出“控件”对话框,之后选择“新式->数组、矩阵与簇->数组”,在前面板中…...

Android 10.0 系统systemui下拉通知栏的通知布局相关源码分析
1.前言 在android10.0的系统rom开发中,在进行systemui中的下拉通知栏的布局自定义的时候,对于原生systemui的 系统的下拉通知栏的通知布局的了解也是非常重要的,接下来就来分析下相关的下拉通知栏的通知布局的相关 源码流程,了解这些才方便对通知栏的布局做修改 2.系统…...

研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型)
研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型) 变量|常量与可变性变量声明案例为什么不可变变量可变(mut关键字)变量可变(覆盖) 常量声明 数据类型标量类型整型整型字面值整型溢出问…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

react更新页面数据,操作页面,双向数据绑定
// 路由不是组件的直接跳转use client,useEffect,useRouter,需3个结合, use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...

使用ch340继电器完成随机断电测试
前言 如图所示是市面上常见的OTA压测继电器,通过ch340串口模块完成对继电器的分路控制,这里我编写了一个脚本方便对4路继电器的控制,可以设置开启时间,关闭时间,复位等功能 软件界面 在设备管理器查看串口号后&…...