有時候,下載大量圖像需要幾個小時——讓我們來解決這個問題
我明白了——你已經厭倦了等待你的程式下載圖像。有時我必須下載數千張圖像需要幾個小時,而且你不可能一直等待你的程式完成下載這些愚蠢的圖像。你有很多重要的事情要做。
讓我們建立一個簡單的圖像下載器腳本,它將讀取一個文字檔案並以超快的速度下載一個資料夾中列出的所有圖像。
最終效果
這就是我們最終要建立的效果。
安裝依賴項
讓我們可以安裝每個人最喜歡的 requests 函式庫。
pip install requests
現在,我們將看到一些用於下載單一 URL 並嘗試自動尋找圖像名稱以及如何使用重試的基本程式碼。
import requests res = requests.get(img_url, stream=True) count = 1 while res.status_code != 200 and count <p>在這裡,我們重試下載圖片五次,以防失敗。現在,讓我們嘗試自動找到圖像的名稱並保存它。 </p><pre class="brush:php;toolbar:false">import more required library import io from PIL import Image # lets try to find the image name image_name = str(img_url[(img_url.rfind('/')) + 1:]) if '?' in image_name: image_name = image_name[:image_name.find('?')]
解釋
假設我們要下載的URL 是:
instagram.fktm7-1.fna.fbcdn.net/vp ....
好吧,這是一團糟。讓我們分解一下程式碼對 URL 的作用。我們首先使用 rfind
找到最後一個正斜線(/
),然後選擇之後的所有內容。這是結果:
65872070_1200425330158967_6201268309743367902_n.jpg?_nc_ht=instagram.fktm7–1.fna.ccdn.net&_fb_nc_ht#cnc_cat_catc1#.fna.ccdn.net&_fb_cat_1111 月的第二個部分找到我們的第二個部分。 ##?,然後只取它前面的任何東西。
這是我們最終的映像名稱:
這個結果非常好,適用於大多數用例。 現在我們已經下載了圖片名稱和映像,我們將保存它。
i = Image.open(io.BytesIO(res.content)) i.save(image_name)
如果你在想,「我到底該怎麼使用上面的程式碼?」那麼你的想法是正確的。這是一個漂亮的函數,我們在上面所做的一切都被扁平處理了。在這裡,我們還測試了下載的類型是否為圖像,以防找不到圖像名稱。
def image_downloader(img_url: str): """ Input: param: img_url str (Image url) Tries to download the image url and use name provided in headers. Else it randomly picks a name """ print(f'Downloading: {img_url}') res = requests.get(img_url, stream=True) count = 1 while res.status_code != 200 and count <p>現在,你可能會問:「這個人所說的多處理在哪裡?」。 </p><p>這很簡單。我們將簡單地定義我們的池並將我們的函數和圖像 URL 傳遞給它。 </p><pre class="brush:php;toolbar:false">results = ThreadPool(process).imap_unordered(image_downloader, images_url) for r in results: print(r)
讓我們把它放在一個函數中:
def run_downloader(process:int, images_url:list): """ Inputs: process: (int) number of process to run images_url:(list) list of images url """ print(f'MESSAGE: Running {process} process') results = ThreadPool(process).imap_unordered(image_downloader, images_url) for r in results: print(r)
再一次,你可能會說,「這一切都很好,但我想立即開始下載我的1000 張圖像清單。我不想複製和貼上所有這些程式碼並試圖弄清楚如何合併所有內容。」
這是一個完整的腳本。它執行以下操作:
以圖像清單文字檔案和進程編號作為輸入
-
按照您想要的速度下載它們
列印下載檔案的總時間
還有一些不錯的函數可以幫助我們讀取檔案名稱並處理錯誤和其他東西
- 完整的腳本
# -*- coding: utf-8 -*- import io import random import shutil import sys from multiprocessing.pool import ThreadPool import pathlib import requests from PIL import Image import time start = time.time() def get_download_location(): try: url_input = sys.argv[1] except IndexError: print('ERROR: Please provide the txt file\n$python image_downloader.py cats.txt') name = url_input.split('.')[0] pathlib.Path(name).mkdir(parents=True, exist_ok=True) return name def get_urls(): """ 通过读取终端中作为参数提供的 txt 文件返回 url 列表 """ try: url_input = sys.argv[1] except IndexError: print('ERROR: Please provide the txt file\n Example \n\n$python image_downloader.py dogs.txt \n\n') sys.exit() with open(url_input, 'r') as f: images_url = f.read().splitlines() print('{} Images detected'.format(len(images_url))) return images_url def image_downloader(img_url: str): """ 输入选项: 参数: img_url str (Image url) 尝试下载图像 url 并使用标题中提供的名称。否则它会随机选择一个名字 """ print(f'Downloading: {img_url}') res = requests.get(img_url, stream=True) count = 1 while res.status_code != 200 and count <h2 id="將其儲存到Python怎麼多線程並發下載圖片怎麼多線程並發下載圖片-檔案中-然後執行它-strong-pre-python-image-downloader-py-cats-txt-pre-strong-這是-GitHub-儲存庫的連結">將其儲存到Python怎麼多線程並發下載圖片怎麼多線程並發下載圖片 檔案中,然後執行它。 <strong><pre class="brush:php;toolbar:false">python3 image_downloader.py cats.txt這是 GitHub 儲存庫的連結。 用法
python3 image_downloader.py <filename_with_urls_seperated_by_newline.txt> <num_of_process></num_of_process></filename_with_urls_seperated_by_newline.txt>
這將讀取文字檔案中的所有 URL,並將它們下載到名稱與檔案名稱相同的資料夾中。
num_of_process是可選的(預設情況下,它使用 10 個進程)。
範例
python3 image_downloader.py cats.txt
#【相關推薦:#Python怎麼多線程並發下載圖片怎麼多線程並發下載圖片3影片教學
】
以上是Python怎麼多線程並發下載圖片的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3漢化版
中文版,非常好用

Dreamweaver Mac版
視覺化網頁開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器