Python实现批量图片下载及去重处理

这篇具有很好参考价值的文章主要介绍了Python实现批量图片下载及去重处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

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

内容

首先,我们需要使用 Python 中的 Requests 库来下载图片,并使用 OS 库来创建保存图片的文件夹。下载图片后,我们可以使用 hashlib 库对图片的内容做哈希处理,并将处理后的哈希值作为图片的唯一识别标志,以便进行去重处理。在对图片进行去重处理时,我们需要将下载的图片与已有的图片进行比对,可以使用字典或集合等数据结构来存储已有图片的哈希值,以便查找和比对。在所有的图片下载完成后,我们可以将下载的图片的文件名或哈希值保存到本地文本文件中,以备后续查看或处理。
Python实现批量图片下载及去重处理
Python实现批量图片下载及去重处理

一些好看的动漫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/123924270

def 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 = 1000
    download_images(dir_path, file_prefix, num_images)

2、图片去重

原理:MD5 是一种常用的哈希算法,它可以将任意长度的输入(比如一个字符串或者一个文件)转换成一个 128 比特长度的输出,输出值通常表示为一个 32 位的十六进制数字串。而对于任意输入的变化,其产生的输出也会有所不同,因此可以将 MD5 值作为唯一的识别标志来去重。在 Python 中,我们可以使用 hashlib 库中的 md5 函数来生成 MD5 值。

流程:其具体实现流程如下:文章来源地址https://www.toymoban.com/news/detail-416565.html

  1. 导入 hashlib 库。
  2. 定义与图片相关的 path、filename 和 filesize 等变量,使用 os.path 库中的函数处理路径和文件名。
  3. 对图片的二进制数据使用 hashlib.md5() 生成 MD5 值。
  4. 将生成的 MD5 值转换为字符串格式,去除无用字符。
  5. 使用集合或字典等数据结构存储已有图片的 MD5 值,在遍历待下载的图片时,判断其对应的 MD5 值是否已经存在于集合或字典中,若存在则说明图片已下载过,不再重复下载;否则可以将该图片下载下来,并将其对应的 MD5 值加入到已有图片集合中。
  6. 下载图片后,将其文件名或 MD5 值存储到本地文本文件中,便于后续查看或处理。
    上述流程基本描述了使用 MD5 值去重的具体实现过程,其中还需结合具体应用场景进行优化和改进。
import os
import shutil
import hashlib


def get_md5(file):
    """计算文件的MD5值"""
    if not os.path.isfile(file):
        return None
    with 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_dir
    target_dir = 'repeat_image'
    dir_path = 'dongman'
    find_duplicate_images(dir_path)

到了这里,关于Python实现批量图片下载及去重处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java批量下载书籍图片并保存为PDF的方法

    因为经常出差火车上没网、不方便电子书阅读器批注,需要从某网站上批量下载多本书籍的图片并自动打包成PDF文件。 1、尝试获得图片地址,发现F12被禁 解决方法:使用Chrome浏览器,点击右上角三个点呼出菜单,选择“更多工具”-“开发者工具” 或者使用Ctrl+Shift+C、Ctrl

    2024年02月13日
    浏览(28)
  • 《Stable Diffusion WebUI折腾实录》在Windows完成安装, 从社区下载热门模型,批量生成小姐姐图片

    操作系统: Windows11 显卡: RTX2060 6GB 显存 下载 Python3.10.6 安装 注意勾选 Add Python 3.10.6 to PATH ,然后一路 下一步 即可 打开powershell, 确认安装成功 下载git 完成安装 为了避免找不到开源项目,可以像上图中的我一样, 先在用户目录建立一个github文件夹,进入文件夹后,再下载开源

    2024年02月11日
    浏览(27)
  • Python Selenium如何下载网页中的图片到本地?(Base64编码的图片下载)

    前言:                 在网页上,图片有时会以Base64编码的形式嵌入在HTML中,而不是作为单独的文件提供。这种方式的优点是可以减少HTTP请求的数量,因为图片数据直接包含在HTML中,不需要额外的请求来获取图片文件。这对于小图片或图标特别有用,因为这些图片的文

    2024年04月17日
    浏览(31)
  • Python 爬虫网页图片下载到本地

    您可以使用Python的requests库来获取网页的源码,使用BeautifulSoup库来解析HTML,并使用urllib库来下载图片到本地。下面是一个示例代码: 请注意,上述代码中的URL和文件名是示例,您需要根据实际情况进行替换。另外,这段代码只能下载图片类型为JPEG的文件,如果想要下载其他

    2024年02月11日
    浏览(35)
  • 织梦dedecms不能下载远程图片实现图片本地化解决方法

    DEDE图片本地化失效的主要原因: 服务器上的运行环境中禁用了fsockopen()函数 解决方案一: 在用fsockopen()的地方用stream_socket_client()函数代替。 具体修改地方是 /include/dedehttpdown.class.php 第507行 $this-m_fp = @fsockopen($this-m_host, $this-m_port, $errno, $errstr,10); 替换为 $this-m_fp = @stream_socke

    2023年04月24日
    浏览(38)
  • 软件测试|教你使用Python下载图片

    前言 我一直觉得Windows系统默认的桌面背景不好看,但是自己又没有好的资源可以进行替换,突然我一个朋友提醒了我,网络上的图片这么多,你甚至可以每天换很多个好看的背景,但是如果让我手动去设置的话,我觉得太麻烦了,我不如使用技术手段将图片下载到本地,并

    2024年02月01日
    浏览(43)
  • 微信小程序实现图片下载与保存功能

    首先,定义了一个全局的定时器变量 timer 。 在 downloadImage 函数中,如果 timer 已经存在,就清除它,以确保每次只有一个下载任务在进行。 然后,设置一个新的定时器,延迟1秒后开始执行下载任务。这是为了防止频繁触发下载操作。 在定时器的回调函数中,首先显示一个加

    2024年02月03日
    浏览(57)
  • Python:使用requests库下载图片(含完整源码)

    Python:使用requests库下载图片(含完整源码) 在这篇文章中,我将介绍如何使用Python的requests库实现下载图片的功能,并提供完整的源代码。 首先,我们需要安装requests库。可以使用以下命令在终端或命令行中安装它: 接下来,我们需要导入requests库和os库,os库主要是用于创

    2024年02月13日
    浏览(53)
  • VSCode Webview中如何实现点击下载图片

    众所周知,在一个普通的HTML页面中,如果要实现一个链接点击后下载图片,只需要在页面上放一个a标签,然后将属性href的值指向图片的URL或者Base64字符串就可以了。或者按照stackoverflow上提供的方法动态创建a标签来完成图片的下载动作。不过原理都是相同的。 但是这个方法

    2023年04月26日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包