Python批量下載圖片的實現(xiàn)步驟
更新時間:2025年10月04日 08:36:31 作者:detayun
在我們日常生活中,有時候進入一個網站后,發(fā)現(xiàn)大量的圖片,比如說一些好看的素材,以及我以前非常喜歡看的風景圖片,想要下載下來怎么辦?難道我一張張去復制?這有點不現(xiàn)實,所以本文給大家介紹了Python批量下載圖片的實現(xiàn)步驟,需要的朋友可以參考下
在Python中批量下載圖片可以通過以下步驟實現(xiàn),這里提供一個完整的代碼示例:
基礎方案:使用requests庫
import os
import requests
from urllib.parse import urlparse
def download_images(image_urls, save_dir='images'):
"""
批量下載圖片到指定目錄
:param image_urls: 圖片URL列表
:param save_dir: 保存目錄(默認保存到當前目錄的images文件夾)
"""
# 創(chuàng)建保存目錄
os.makedirs(save_dir, exist_ok=True)
for url in image_urls:
try:
# 發(fā)送HTTP請求
response = requests.get(url, stream=True, timeout=5)
response.raise_for_status() # 檢查請求是否成功
# 提取文件名
parsed_url = urlparse(url)
filename = os.path.basename(parsed_url.path)
if not filename:
filename = f"image_{len(os.listdir(save_dir)) + 1}.jpg"
# 保存文件
filepath = os.path.join(save_dir, filename)
with open(filepath, 'wb') as f:
for chunk in response.iter_content(1024):
f.write(chunk)
print(f"成功下載: {filename}")
except Exception as e:
print(f"下載失敗 {url} - 錯誤: {str(e)}")
# 示例使用
if __name__ == "__main__":
# 從網頁解析圖片URL(示例)
image_urls = [
"https://example.com/images/cat.jpg",
"https://example.com/images/dog.png",
"https://example.com/images/bird.webp"
]
download_images(image_urls)
進階方案:從網頁批量抓取圖片
from bs4 import BeautifulSoup
import requests
def scrape_images_from_webpage(url, save_dir='images'):
"""從網頁中抓取所有圖片并下載"""
try:
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
img_tags = soup.find_all('img')
image_urls = [img.get('src') for img in img_tags if img.get('src')]
download_images(image_urls, save_dir)
except Exception as e:
print(f"抓取失敗: {str(e)}")
# 示例使用
scrape_images_from_webpage("https://example.com/gallery")
關鍵點說明:
依賴庫安裝:
pip install requests beautifulsoup4
核心功能:
- 自動創(chuàng)建保存目錄
- 智能處理文件名(保留原始文件名或自動生成)
- 流式下載避免內存溢出
- 完善的錯誤處理
擴展功能建議:
# 添加多線程加速(使用concurrent.futures)
from concurrent.futures import ThreadPoolExecutor
# 在download_images函數(shù)中替換循環(huán)部分
with ThreadPoolExecutor(max_workers=8) as executor:
executor.map(download_single_image, image_urls)
注意事項:
- 遵守網站robots.txt協(xié)議
- 添加User-Agent頭避免被屏蔽
- 添加下載延遲防止IP被封
- 處理不同圖片格式(通過MIME類型判斷)
完整增強版代碼
import os
import requests
from urllib.parse import urlparse
from concurrent.futures import ThreadPoolExecutor
import time
def download_single_image(url, save_dir):
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers, stream=True, timeout=10)
response.raise_for_status()
# 獲取內容類型確定擴展名
content_type = response.headers.get('content-type')
ext = 'jpg' if 'jpeg' in content_type else content_type.split('/')[-1]
filename = os.path.basename(urlparse(url).path) or f"img_{int(time.time()*1000)}.{ext}"
filepath = os.path.join(save_dir, filename)
with open(filepath, 'wb') as f:
for chunk in response.iter_content(8192):
f.write(chunk)
return True, filename
except Exception as e:
return False, str(e)
def batch_download(image_urls, save_dir='images', max_workers=8, delay=0.5):
os.makedirs(save_dir, exist_ok=True)
success = []
failed = []
def worker(url):
result, info = download_single_image(url, save_dir)
if result:
success.append(info)
else:
failed.append((url, info))
time.sleep(delay) # 避免請求過載
with ThreadPoolExecutor(max_workers=max_workers) as executor:
executor.map(worker, image_urls)
print(f"\n下載完成!成功: {len(success)} 失敗: {len(failed)}")
return success, failed
# 使用示例
if __name__ == "__main__":
urls = [
"https://example.com/image1.jpg",
"https://example.com/image2.png",
# 添加更多URL...
]
success, failed = batch_download(urls)
print("\n成功下載列表:")
for name in success:
print(f" - {name}")
print("\n失敗列表:")
for url, reason in failed:
print(f" - {url}: {reason}")
最佳實踐建議:
- 添加代理支持:在requests.get中添加
proxies參數(shù) - 限速功能:使用
time.sleep()控制請求頻率 - 斷點續(xù)傳:通過檢查文件大小實現(xiàn)
- 自動重試機制:使用
tenacity庫實現(xiàn) - 文件去重:使用哈希值檢查重復文件
這個方案提供了從基礎到進階的完整實現(xiàn),用戶可以根據(jù)實際需求選擇適合的版本。代碼中包含了詳細的錯誤處理和日志輸出,適合直接用于生產環(huán)境。
到此這篇關于Python批量下載圖片的實現(xiàn)步驟的文章就介紹到這了,更多相關Python批量下載圖片內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何安裝多版本python python2和python3共存以及pip共存
這篇文章主要為大家詳細介紹了python多版本的安裝方法,解決python2和python3共存以及pip共存問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09
django queryset 去重 .distinct()說明
這篇文章主要介紹了django queryset 去重 .distinct()說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05

