首頁 >後端開發 >Python教學 >如何使用 Python 自動下載圖片:綜合指南

如何使用 Python 自動下載圖片:綜合指南

WBOY
WBOY原創
2024-08-27 06:05:02767瀏覽

How to Automate Image Downloading with Python: A Comprehensive Guide

在當今的數位時代,以程式方式管理和處理影像可以節省您大量的時間和精力。如果您希望自動化從網路下載圖像的過程,那麼您來對地方了。在本文中,我們將深入研究一個 Python 腳本,該腳本使用 Pexels API(高品質庫存照片的流行來源)來執行此操作。

概述
此處提供的 Python 腳本可讓您根據查詢在 Pexels 上搜尋映像,如果滿足特定條件則下載它們,並將它們儲存到本機系統。該腳本使用了多個強大的程式庫和 API,包括 requests、Pillow 和 Pexels API。

腳本的主要特點
API 整合:使用 API 從 Pexels 取得影像。
動態濾鏡:根據尺寸和方向選擇影像。
日期模擬:雖然 Pexels API 不直接支援基於日期的過濾,但腳本透過產生隨機日期來模擬這一點。
速率限制:避免因隨機延遲而達到 API 速率限制。

理解程式碼

導入與設定

import os
import requests
from PIL import Image
from io import BytesIO
import random
import time
from datetime import datetime, timedelta

腳本先導入必要的函式庫。這是一個快速概述:

  • os 和 requests 分別用於與檔案系統互動和發出 HTTP 請求。
  • PIL(Pillow)用於處理影像操作。
  • random、time 和 datetime 用於產生隨機數、管理延遲和處理日期。
API_KEY = '...'  # Replace with your actual Pexels API key
BASE_URL = 'https://api.pexels.com/v1/search'
OUTPUT_DIR = 'output'
SEARCH_QUERY = 'Subaru Forester'
MIN_WIDTH = 1080
MIN_HEIGHT = 1920
NUM_IMAGES = 16
ORIENTATION = 'vertical'

設定您的 API 金鑰、Pexels 的基本 URL,並指定其他參數,例如搜尋查詢、最小圖片尺寸、要下載的圖片數量和圖片方向。

確保輸出目錄存在

if not os.path.exists(OUTPUT_DIR):
    os.makedirs(OUTPUT_DIR)

腳本檢查輸出目錄是否存在並在必要時建立它。

取得影像

def get_images(query, page=1, per_page=15):
    params = {
        'query': query,
        'page': page,
        'per_page': per_page
    }
    response = requests.get(BASE_URL, headers=headers, params=params)
    response.raise_for_status()
    return response.json()

此函數向 Pexels API 發送請求,以根據搜尋查詢和其他參數取得影像。

下載並儲存圖片

def download_and_save_image(url, filename):
    response = requests.get(url)
    response.raise_for_status()
    img = Image.open(BytesIO(response.content))
    if img.width >= MIN_WIDTH and img.height >= MIN_HEIGHT:
        if ORIENTATION == 'vertical' and (img.height / img.width > 1.4):
            img.save(filename)
            print(f'Saved {filename}')
            return 1
        elif ORIENTATION == 'horizontal' and (img.width / img.height > 1.4):
            img.save(filename)
            print(f'Saved {filename}')
            return 1
    return 0

此函數處理從 URL 下載圖像,檢查其尺寸和方向,如果符合條件則保存它。

產生隨機日期

def generate_random_date():
    end_date = datetime.now()
    start_date = end_date - timedelta(days=4*365)
    random_date = start_date + timedelta(days=random.randint(0, 4*365))
    return random_date

此函數會產生過去四年內的隨機日期。雖然 Pexels API 不直接提供基於日期的過濾,但此隨機日期模擬了這樣的過濾器。

主要功能

def main():
    images_downloaded = 0
    page = 1
    seen_images = set()
    target_date = generate_random_date()
    print(f"Target date for filtering: {target_date.strftime('%Y-%m-%d')}")


while images_downloaded < NUM_IMAGES:
        data = get_images(SEARCH_QUERY, page)
        photos = data.get('photos', [])
        if not photos:
            print('No more photos found.')
            break
        random.shuffle(photos)  # Shuffle to get a more random selection
        for photo in photos:
            if images_downloaded >= NUM_IMAGES:
                break
            image_url = photo['src']['original']
            photo_date = datetime.strptime(photo['created_at'], '%Y-%m-%dT%H:%M:%S%z') if 'created_at' in photo else datetime.now()
            if photo_date > target_date and image_url not in seen_images:
                filename = os.path.join(OUTPUT_DIR, f'image_{images_downloaded + 1}.jpg')
                if download_and_save_image(image_url, filename):
                    images_downloaded += 1
                    seen_images.add(image_url)
        page += 1
        time.sleep(random.uniform(1, 2))  # Sleep to avoid hitting API rate limits

main() 函數協調影像擷取、下載和儲存過程。它管理分頁、檢查重複影像並強制延遲以遵守 API 的速率限制。

運行腳本
若要執行此腳本,請確保您已將 API_KEY 替換為實際的 Pexels API 金鑰,並根據需要調整其他參數。將腳本保存在 .py 檔案中並使用 Python 解釋器執行它。符合指定條件的影像將保存在輸出目錄中。

結論
自動圖像下載可以簡化您的工作流程並確保您擁有高品質的圖像。該 Python 腳本為此類任務提供了堅實的基礎,並且可以根據您的需求靈活地進行自訂。無論您是在處理個人專案還是將映像下載整合到更大的應用程式中,此腳本都展示了 Python 在處理基於 Web 的任務方面的強大功能和多功能性。

以上是如何使用 Python 自動下載圖片:綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn