使用Python下載文件的簡單示例

在本教程中,您將學習如何使用不同的Python模塊從Web下載文件。此外,您還將下載常規文件、網頁、AmazonS 3和其他來源。

最後,您將學習如何克服可能遇到的各種挑戰,例如下載重定向文件、下載大型文件、完成多線程下載以及其他策略。


使用Python下載文件的簡單示例


使用請求

您可以使用請求模塊從URL下載文件。

考慮以下守則:

<code>import requests/<code>
<code>url = 'https://www.python.org/static/img/[email protected]'/<code>
<code>myfile = requests.get(url)/<code>
<code>open('c:/users/LikeGeeks/downloads/PythonImage.png', 'wb').write(myfile.content)/<code>

只需使用get 方法,並將結果存儲到名為“myfile”的變量中。然後,將變量的內容寫入文件中。

使用wget

還可以使用惠特Python模塊。這個wget 可以使用PIP安裝模塊,如下所示:

<code>pip install wget/<code>

考慮下面的代碼,我們將下載Python的徽標圖像:

<code>import wget/<code>
<code>url = "https://www.python.org/static/img/[email protected]"/<code>
<code>wget.download(url, 'c:/users/LikeGeeks/downloads/pythonLogo.png')/<code>

在這段代碼中,URL以及路徑(圖像將在其中存儲)被傳遞給wget模塊的下載方法。

重定向的下載文件

在本節中,您將學習如何從URL下載,該URL使用請求重定向到另一個帶有.pdf文件的URL。URL內容如下:

https://readthedocs.org/projects/python-guide/downloads/pdf/latest/

要下載此pdf文件,請使用以下代碼:

<code>import requests/<code>
<code>url = 'https://readthedocs.org/projects/python-guide/downloads/pdf/latest/'/<code>
<code>myfile = requests.get(url, allow_redirects=True)/<code>
<code>open('c:/users/LikeGeeks/documents/hello.pdf', 'wb').write(myfile.content)/<code>

在這段代碼中,我們指定的第一步是URL。然後,我們使用請求模塊的get方法來獲取URL。在get方法中,我們設置allow_redirects到True,這將允許在URL中重定向,而重定向後的內容將分配給變量myfile.

最後,我們打開一個文件來編寫獲取的內容。

塊下載大文件

考慮以下守則:

<code>import requests/<code> 
<code>url = 'https://www.python.org/static/img/[email protected]'/<code>
<code>myfile = requests.get(url)/<code>
<code>open('c:/users/LikeGeeks/downloads/PythonImage.png', 'wb').write(myfile.content)/<code>

首先,我們像以前一樣使用請求模塊的get方法,但這一次,我們將流屬性設置為True。

然後,我們在當前工作目錄中創建一個名為PythonBook.pdf的文件,並打開它進行寫入。

然後,我們指定要一次下載的塊大小。我們已經設置為1024字節,遍歷每個塊,並在文件中寫入塊直到塊完成。

不漂亮?別擔心,我們稍後會顯示下載過程的進度條。

下載多個文件(並行/批量下載)

若要一次下載多個文件,請導入以下模塊:

<code>import os/<code>
<code>import requests/<code>
<code>from time import time/<code>
<code>from multiprocessing.pool import ThreadPool/<code>

我們導入了操作系統和時間模塊,以檢查下載文件所需的時間。模塊ThreadPool 允許您使用池運行多個線程或進程。

讓我們創建一個簡單的函數,將響應以塊的形式發送到文件:

<code>def url_response(url):/<code>
<code>    path, url = url/<code>
<code>    r = requests.get(url, stream = True)/<code>
<code>    with open(path, 'wb') as f:/<code>
<code>        for ch in r:/<code>
<code>            f.write(ch)/<code>

URL是一個二維數組,它指定要下載的頁面的路徑和URL。

<code>urls = [("Event1", "https://www.python.org/events/python-events/805/"),/<code>
<code>("Event2", "https://www.python.org/events/python-events/801/"),/<code>
<code>("Event3", "https://www.python.org/events/python-events/790/"),/<code>
<code>("Event4", "https://www.python.org/events/python-events/798/"),/<code>
<code>("Event5", "https://www.python.org/events/python-events/807/"),/<code>
<code>("Event6", "https://www.python.org/events/python-events/807/"),/<code>
<code>("Event7", "https://www.python.org/events/python-events/757/"),/<code>
<code>("Event8", "https://www.python.org/events/python-user-group/816/")]/<code>

將URL傳遞給requests.get,就像我們在上一節中所做的那樣。最後,打開文件(URL中指定的路徑)並寫入頁面的內容。

現在,我們可以對每個URL分別調用這個函數,也可以同時調用所有URL的這個函數。讓我們在for循環中分別對每個URL執行此操作,並注意計時器:

<code>start = time()/<code>
<code>for x in urls:/<code>
<code>url_response (x)/<code>
<code>print(f"Time to download: {time() - start}")/<code>


現在,用以下代碼行替換for循環:

<code> ThreadPool(9).imap_unordered(url_response, urls)/<code>

運行腳本。

用進度欄下載

進度條是客戶端模塊的UI小部件。若要安裝客戶端模塊,請鍵入以下命令:

pip install clint

考慮以下代碼:

<code>import requests/<code>
<code>from clint.textui import progress/<code>
<code>url = 'http://do1.dr-chuck.com/pythonlearn/EN_us/pythonlearn.pdf'/<code>
<code>r = requests.get(url, stream=True)/<code>
<code>with open("LearnPython.pdf", "wb") as Pypdf:/<code>
<code>    total_length = int(r.headers.get('content-length'))/<code>
<code>    for ch in progress.bar(r.iter_content(chunk_size = 2391975), expected_size=(total_length/1024) + 1):/<code>
<code>if ch:/<code>
<code>Pypdf.write(ch)
/<code>

在這段代碼中,我們導入了請求模塊,然後從clint.textui導入了進度小部件。唯一的區別是for循環。我們在將內容寫入文件時使用了進度模塊的BAR方法。

使用urllib下載網頁

在本節中,我們將使用urllib下載一個網頁。

urllib庫是Python的標準庫,因此不需要安裝它。

以下代碼行可以輕鬆下載網頁:urllib.request.urlretrieve('url', 'path')

在這裡指定要保存的URL以及要存儲它的位置:

urllib.request.urlretrieve('https://www.python.org/', 'c:/users/LikeGeeks/documents/PythonOrganization.html')

在這段代碼中,我們使用了urlretrieve 方法並傳遞文件的URL,以及保存文件的路徑。文件擴展名為.html。

通過代理下載

如果需要使用代理下載文件,可以使用ProxyHandler 在urllib模塊中。檢查以下代碼:

import urllib.request>>> myProxy = urllib.request.ProxyHandler({'http': '127.0.0.2'})>>> openProxy = urllib.request.build_opener(myProxy)>>> urllib.request.urlretrieve('https://www.python.org/')

在此代碼中,我們創建了代理對象,並通過調用build_opener方法並傳遞代理對象。然後,我們請求檢索頁面。

此外,您還可以使用正式文檔中記錄的請求模塊:import requestsmyProxy = { 'http': 'http://127.0.0.2:3001' }requests.get("https://www.python.org/", proxies=myProxy)

使用urllib 3

urllib 3是urllib模塊的改進版本。您可以使用pip下載並安裝它:pip install urllib3我們將獲取一個網頁,並使用urllib 3將其存儲在文本文件中。導入以下模塊:

import urllib3, shutil

shutil模塊在處理文件時使用。現在,初始化URL字符串變量,如下所示:url = 'https://www.python.org/'然後,我們使用PoolManager 用於跟蹤必要的連接池的urllib 3。

c = urllib3.PoolManager()創建一個文件:

filename = "test.txt"

最後,我們發送一個GET請求來獲取URL並打開一個文件並將響應寫到該文件中:with c.request('GET', url, preload_content=False) as res, open(filename, 'wb') as out_file:shutil.copyfileobj(res, out_file)

使用Boto 3從S3下載文件

要從AmazonS 3下載文件,可以使用PythonBoto 3模塊。在開始之前,您需要使用pip安裝awscli模塊:pip install awscli對於AWS配置,運行以下命令:

aws configure現在,輸入您的詳細信息如下:

AWS Access Key ID [None]: (The access key)AWS Secret Access Key [None]: (Secret access key)Default region name [None]: (Region)Default output format [None]: (Json)要從AmazonS 3下載文件,請導入boto 3和botocore。Boto 3是用於Python訪問AmazonWeb服務(如S3)的AmazonSDK。Botocore提供命令行服務來與AmazonWeb服務交互。Botocore配備了awscli。要安裝boto 3,運行以下命令:pip install boto3現在,導入這兩個模塊:

import boto3, botocore當從Amazon下載文件時,我們需要三個參數:桶的名字需要下載的文件的名稱。文件下載後的名稱。初始化變量:bucket = "bucketName"file_name = "filename"downloaded_file = "downloadedfilename"

現在,初始化一個變量以使用會話的資源。為此,我們將調用resource()方法並傳遞服務,即S3:

service = boto3.resource(‘s3’)

最後,使用download_file 方法並傳入變量:

service.Bucket(bucket).download_file(file_name, downloaded_file)

使用異步

異步模塊的重點是處理系統事件。它圍繞一個事件循環工作,該循環等待事件發生,然後對該事件作出反應。反應可以是調用另一個函數。這個過程叫做偶數處理。異步模塊使用協同處理事件。為了使用異步事件處理和協同服務功能,我們將導入異步模塊:import asyncio現在,定義異步協同器方法,如下所示:

async def coroutine(): await my_func()關鍵字異步告訴我們,這是一個本機異步協同器。在協同線的主體中,我們有一個等待關鍵字,它返回一個特定的值。返回關鍵字也可以使用。現在,讓我們使用Cooutine創建一個代碼,從Web下載一個文件:>>> import os

>>> import urllib.request

>>> async def coroutine(url):

r = urllib.request.urlopen(url)

filename = "couroutine_downloads.txt"

with open(filename, 'wb') as f:

for ch in r:

f.write(ch)

print_msg = 'Successfully Downloaded'

return print_msg

>>> async def main_func(urls_to_download):

co = [coroutine(url) for url in urls_to_download]

downloaded, downloading = await asyncio.wait(co)

for i in downloaded:

print(i.result())

urls_to_download = ["https://www.python.org/events/python-events/801/",

"https://www.python.org/events/python-events/790/",

"https://www.python.org/events/python-user-group/816/",

"https://www.python.org/events/python-events/757/"]

>>> eventLoop = asyncio.get_event_loop()

>>> eventLoop.run_until_complete(main_func(urls_to_download))在這段代碼中,我們創建了一個異步協同函數,用於下載我們的文件並返回一條消息。然後,我們有另一個異步協同器調用main_func 它等待URL並生成所有URL的隊列。異步的等待函數等待協同器的完成。現在,要啟動coroutine,我們必須將coroutine放入事件循環中,方法是使用get_event_loop()方法,最後,使用run_until_complete()異步方法

使用Python下載文件很有趣。希望這個教程對你有用!


分享到:


相關文章: