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

2020-12-11 源碼時代

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

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

使用請求

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

考慮以下守則:

import requests

url = 'https://www.python.org/static/img/python-logo@2x.png'

myfile = requests.get(url)

open('c:/users/LikeGeeks/downloads/PythonImage.png', 'wb').write(myfile.content)

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

使用wget

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

pip install wget

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

import wget

url = "https://www.python.org/static/img/python-logo@2x.png"

wget.download(url, 'c:/users/LikeGeeks/downloads/pythonLogo.png')

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

重定向的下載文件

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

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

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

import requests

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

myfile = requests.get(url, allow_redirects=True)

open('c:/users/LikeGeeks/documents/hello.pdf', 'wb').write(myfile.content)

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

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

塊下載大文件

考慮以下守則:

import requests

url = 'https://www.python.org/static/img/python-logo@2x.png'

myfile = requests.get(url)

open('c:/users/LikeGeeks/downloads/PythonImage.png', 'wb').write(myfile.content)

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

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

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

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

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

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

import os

import requests

from time import time

from multiprocessing.pool import ThreadPool

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

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

def url_response(url):

path, url = url

r = requests.get(url, stream = True)

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

for ch in r:

f.write(ch)

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

urls = [("Event1", "https://www.python.org/events/python-events/805/"),

("Event2", "https://www.python.org/events/python-events/801/"),

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

("Event4", "https://www.python.org/events/python-events/798/"),

("Event5", "https://www.python.org/events/python-events/807/"),

("Event6", "https://www.python.org/events/python-events/807/"),

("Event7", "https://www.python.org/events/python-events/757/"),

("Event8", "https://www.python.org/events/python-user-group/816/")]

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

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

start = time()

for x in urls:

url_response (x)

print(f"Time to download: {time() - start}")

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

ThreadPool(9).imap_unordered(url_response, urls)

運行腳本。

用進度欄下載

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

pip install clint

考慮以下代碼:

import requests

from clint.textui import progress

url = 'http://do1.dr-chuck.com/pythonlearn/EN_us/pythonlearn.pdf'

r = requests.get(url, stream=True)

with open("LearnPython.pdf", "wb") as Pypdf:

total_length = int(r.headers.get('content-length'))

for ch in progress.bar(r.iter_content(chunk_size = 2391975), expected_size=(total_length/1024) + 1):

if ch:

Pypdf.write(ch)

在這段代碼中,我們導入了請求模塊,然後從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下載文件很有趣。希望這個教程對你有用!

相關焦點

  • 每日一課 | Python –讀取XML文件(DOM示例)
    讀取XML文件並列印出其值。XML文件一個簡單的XML文件,稍後使用Python minidom對其進行解析。staff.xml <?xml version="1.0"?DOM示例1一個簡單的Python minidom示例。
  • 如何使用Python 和 Pandas讀寫JSON文件
    最後,作為獎勵,我們還將學習如何操作Pandas數據幀中的數據、重命名列和使用Seaborn對數據繪製圖表。什麼是JSON文件?JSON是JavaScript對象表示法的縮寫,是一種緊湊的、基於文本的格式,用於交換數據。這種格式通常用於通過所謂的Web API來從web伺服器下載和存儲信息。
  • 使用Python處理NetCDF格式文件
    在地球科學領域使用較為廣泛,大多數數值模式,衛星,雷達等數據格式通常為NetCDF格式。文件中的變量和屬性等信息,ncview,panoply可以對NetCDF文件中的變量進行簡單的可視化,如果需要對NetCDF文件進行裁剪,算術運算或者插值等操作,可以使用nco或cdo等工具。
  • Python中文分詞工具大合集:安裝、使用和測試
    編譯和安裝python版(兼容python2.x版和python3.x版)從github下載(需下載模型文件,見獲取模型)將thulac文件放到目錄下,通過 import thulac 來引用thulac需要模型的支持,需要將下載的模型放到thulac目錄下。
  • 氣象編程 | 使用python操作Excel文件
    今天使用Python來操作Excel。python操作Excel的庫有很多,大概有xlrd、xlwt、openpyxl、XlsxWriter、xlutils、pandas等。這些庫的操作對xls和xlsx的支持不同,有個只可以操作xls,有的只可以進行讀操作。
  • Python通過fnmatch模塊實現文件名匹配
    需要的朋友可以參考下fnmatch 模塊主要用於文件名稱的匹配,其能力比簡單的字符串匹配更強大,但比使用正則表達式相比稍弱。。如果在數據處理操作中,只需要使用簡單的通配符就能完成文件名的匹配,則使用 fnmatch 模塊是不錯的選擇。fnmatch 模塊中,常用的函數及其功能如表 1 所示。
  • python3使用ctypes在windows中訪問C和C++動態連結庫函數示例
    python3使用ctypes在windows中訪問C和C++動態連結庫函數示例這是我們的第一個示例,我們儘量簡單,不傳參,不返回,不訪問其他的動態連結庫一 測試環境介紹和準備)Python3.7.0 (源碼和安裝文件)http://ffmpeg.club/python二 C/C++部分代碼1 首先完成C/C++的動態連結庫,與做python擴展庫不同,ctypes
  • 今天破解了壓縮文件的密碼:使用python輕鬆編寫破解程序
    獲取ZIP文件解壓密碼今天傑瑞又閒著無事可幹,索性去做了一個非常簡單且實用的一個python小程序,這個程序破解獲得zip加密文件的密碼。獲取zip文件解壓密碼的思路是使用窮舉法去「試」出真實密碼。傑瑞今天就教大家如何使用python去破解得到zip文件的解壓密碼,僅需要不到20行代碼即可完成全部功能。實現步驟首先我們需要python裡面的一個庫——zipfile,這個庫專門用來操作zip文件的,這個庫一般是python自帶的不需要安裝。
  • 基於Python實現對各種數據文件的操作
    /pandas-docs/stable/reference/api/pandas.read_csv.html#pandas.read_csvcsv文件的讀入和寫出相對簡單,直接調用pandas的函數即可。
  • 如何使用Python獲取運營數據之文本文件篇
    使用Python獲取數據,目前主要的方法集中在文本文件、Excel文件、關係型和非關係型資料庫、API、網頁等方面。本文先來給大家分享如何使用Python讀取數據1.使用read、readline、readlines讀取數據Python可以讀取任意格式的文本數據,使用Python讀取文本數據的基本步驟是:1)定義數據文件;
  • 80%的人都不知道,全球Python庫下載前10名
    但是你知道全球最受歡迎的python庫嘛?今天小編就從PYPI網站的過去365天的python庫下載量上,來看一下全球最火的22個python庫。01.Urllib3Urllib3在過去365天中,下載量達到了9.55億次。
  • 使用python製作詞雲:快速獲取關鍵信息
    查詢解決方案,有以下幾個:說實在的兩個方案都不像接受,畢竟前者要下載安裝數G的文件,而後者則讓曾經小白的我困惑了許久。選擇暫時後者來解決這個問題,畢竟可能弄明白了wheel安裝,vs的安裝文件還沒有下載下來。wheel文件whl格式本質上是一個壓縮包,裡面包含了py文件,以及經過編譯的pyd文件。
  • Python unittest單元測試框架的使用
    但是txt格式的文件太過於簡陋。我們可以藉助與第三方提供的庫來輸出更加形象的html報告,也可以自定義輸出自己想要格式的html格式的報告。生成HTML測試報告先下載HTMLTestRunner.py(注意Python的版本),http://tungwaiyip.info/software/HTMLTestRunner.html。
  • Python 簡單操作 CSV
    前言這次梳理的篇幅主要是涉及CSV以及如何通過python對CSV進行操作等,對鞏固自己的python知識也是很有幫助的,進一步的對CSV的使用而言也是幫助很大的
  • python實戰演練2:python可執行文件運行不成功怎麼辦
    要談到這個話題,我們首先對如何將python文件製作成exe文件做簡單介紹:眾所周知,python語言作為一種腳本語言,本身是無法自己轉化成可執行文件的,需要藉助第三方工具才能將其轉化為可執行文件(.exe文件)。
  • 資源 | Python中文分詞工具大合集
    編譯和安裝python版(兼容python2.x版和python3.x版)從github下載(需下載模型文件,見獲取模型)將thulac文件放到目錄下,通過 import thulac 來引用thulac需要模型的支持,需要將下載的模型放到thulac目錄下。
  • Python下載微信公眾號文章內的圖片
    剛剛說過使用python下載微信公眾號文章內的視頻,有興趣的同學可以查看上一篇文章,此處就不放文章的連結了。下面我們繼續說一下,如何提取微信公眾號文章內的圖片並進行下載,下面一起來看一下。然後拼接圖片名稱和圖片格式,進行後續的下載保存操作。
  • 奇技淫巧 - Python分割字符串的5個示例
    例如,' 1 2 3 '.split()返回['1', '2', '3']示例1:使用空格分割字符串在這個示例腳本中,我們將使用空格作為分隔符將包含字符串的句子分割成多個子字符串。如果沒有要定義的分隔符,那麼可以只提供split(),它在默認情況下將分隔符視為None。#!
  • 簡單小案例(一):使用Pandas在Python中讀取和寫入CSV文件
    什麼是CSV文件?CSV文件只不過是一個簡單的文本文件。但是,這是存儲表格數據的最常見,最簡單和最簡單的方法。這種特定格式通過遵循分為行和列的特定結構來排列表。這些行和列包含您的數據。每行都以新行終止,以開始下一行。同樣,逗號(也稱為定界符)分隔每行中的列。
  • python+wget輕鬆爬取MP3音樂文件
    發現XX漢語上面有需要的MP3文件。如圖,紅框框起來的就是MP3的url地址。分析一下url,我們大致已經能得出「你」字的MP3文件對應名稱為 ni3.mp3。在地址欄輸入ni3.mp3,結果證實了我們的猜測。