背景
在爬蟲應(yīng)用開發(fā)中,常常需要批量下載圖片,并對圖片進(jìn)行去重處理。Python 是一種非常流行的編程語言,也是開發(fā)爬蟲應(yīng)用的首選,本文將介紹如何使用 Python 下載圖片,并對下載的圖片進(jìn)行去重處理。
內(nèi)容
首先,我們需要使用 Python 中的 Requests 庫來下載圖片,并使用 OS 庫來創(chuàng)建保存圖片的文件夾。下載圖片后,我們可以使用 hashlib 庫對圖片的內(nèi)容做哈希處理,并將處理后的哈希值作為圖片的唯一識別標(biāo)志,以便進(jìn)行去重處理。在對圖片進(jìn)行去重處理時,我們需要將下載的圖片與已有的圖片進(jìn)行比對,可以使用字典或集合等數(shù)據(jù)結(jié)構(gòu)來存儲已有圖片的哈希值,以便查找和比對。在所有的圖片下載完成后,我們可以將下載的圖片的文件名或哈希值保存到本地文本文件中,以備后續(xù)查看或處理。
一些好看的動漫api接口:https://blog.csdn.net/likepoems/article/details/123924270
https://img.r10086.com/
代碼
1、爬取圖片代碼
# -*- coding: utf-8 -*-
# @Time : 2023/3/30 13:56
# @Author : 南宮乘風(fēng)
# @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):
"""
循環(huán)訪問接口并保存圖片到指定目錄
dir_path:圖片保存的目錄
file_prefix:保存的文件名前綴
num_images:需要下載的圖片數(shù)量
"""
if not os.path.exists(dir_path):
os.makedirs(dir_path)
# 設(shè)置請求頭
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:
# 構(gòu)造文件名
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'獲取圖片失敗,狀態(tài)碼:{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 是一種常用的哈希算法,它可以將任意長度的輸入(比如一個字符串或者一個文件)轉(zhuǎn)換成一個 128 比特長度的輸出,輸出值通常表示為一個 32 位的十六進(jìn)制數(shù)字串。而對于任意輸入的變化,其產(chǎn)生的輸出也會有所不同,因此可以將 MD5 值作為唯一的識別標(biāo)志來去重。在 Python 中,我們可以使用 hashlib 庫中的 md5 函數(shù)來生成 MD5 值。文章來源:http://www.zghlxwxcb.cn/news/detail-416565.html
流程:其具體實(shí)現(xiàn)流程如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-416565.html
- 導(dǎo)入 hashlib 庫。
- 定義與圖片相關(guān)的 path、filename 和 filesize 等變量,使用 os.path 庫中的函數(shù)處理路徑和文件名。
- 對圖片的二進(jìn)制數(shù)據(jù)使用 hashlib.md5() 生成 MD5 值。
- 將生成的 MD5 值轉(zhuǎn)換為字符串格式,去除無用字符。
- 使用集合或字典等數(shù)據(jù)結(jié)構(gòu)存儲已有圖片的 MD5 值,在遍歷待下載的圖片時,判斷其對應(yīng)的 MD5 值是否已經(jīng)存在于集合或字典中,若存在則說明圖片已下載過,不再重復(fù)下載;否則可以將該圖片下載下來,并將其對應(yīng)的 MD5 值加入到已有圖片集合中。
- 下載圖片后,將其文件名或 MD5 值存儲到本地文本文件中,便于后續(xù)查看或處理。
上述流程基本描述了使用 MD5 值去重的具體實(shí)現(xiàn)過程,其中還需結(jié)合具體應(yīng)用場景進(jìn)行優(yōu)化和改進(jìn)。
import os
import shutil
import hashlib
def get_md5(file):
"""計(jì)算文件的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):
"""查找重復(fù)圖片"""
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))
# 對于每個圖片,計(jì)算它的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值列表中是否有重復(fù)的值,如果有,則說明該圖片是重復(fù)圖片,將其路徑保存到一個刪除列表中
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])
# 遍歷刪除列表,將其中的圖片移動到目標(biāo)目錄中
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('已移動重復(fù)文件:', image)
except Exception as e:
print('移動失?。?s,錯誤:%s' % (image, str(e)))
print('重復(fù)圖片搜索完成,共找到%d個重復(fù)文件!' % len(delete_list))
# 示例
if __name__ == '__main__':
# 需要移動重復(fù)圖片的目標(biāo)目錄
# target_dir設(shè)置全局變量
global target_dir
target_dir = 'repeat_image'
dir_path = 'dongman'
find_duplicate_images(dir_path)
到了這里,關(guān)于Python實(shí)現(xiàn)批量圖片下載及去重處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!