我有一個小的實用程序,能夠用來按計劃從網站上下載MP3,而後構建/更新我顯然已添加到iTunes的播客XML文件。 html
建立/更新XML文件的文本處理是用Python編寫的。 我在Windows .bat
文件中使用wget下載實際的MP3。 我更但願將整個實用程序用Python編寫。 python
我一直在努力尋找一種方法來實際下載Python中的文件,所以爲何要訴諸wget
。 網站
那麼,如何使用Python下載文件? this
在2012年,使用python請求庫 url
>>> import requests >>> >>> url = "http://download.thinkbroadband.com/10MB.zip" >>> r = requests.get(url) >>> print len(r.content) 10485760
您能夠運行pip install requests
來獲取它。 spa
與API相比,請求具備許多優點,由於API更加簡單。 若是必須執行身份驗證,則尤爲如此。 在這種狀況下,urllib和urllib2很是不直觀且使人痛苦。 code
2015-12-30 orm
人們對進度條表示欽佩。 確定很酷。 如今有幾種現成的解決方案,包括tqdm
: htm
from tqdm import tqdm import requests url = "http://download.thinkbroadband.com/10MB.zip" response = requests.get(url, stream=True) with open("10MB", "wb") as handle: for data in tqdm(response.iter_content()): handle.write(data)
這本質上是30個月前描述的實現@kvance。 ip
用於Python 2/3的PabloG代碼的改進版本:
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import ( division, absolute_import, print_function, unicode_literals ) import sys, os, tempfile, logging if sys.version_info >= (3,): import urllib.request as urllib2 import urllib.parse as urlparse else: import urllib2 import urlparse def download_file(url, dest=None): """ Download and save a file specified by url to dest directory, """ u = urllib2.urlopen(url) scheme, netloc, path, query, fragment = urlparse.urlsplit(url) filename = os.path.basename(path) if not filename: filename = 'downloaded.file' if dest: filename = os.path.join(dest, filename) with open(filename, 'wb') as f: meta = u.info() meta_func = meta.getheaders if hasattr(meta, 'getheaders') else meta.get_all meta_length = meta_func("Content-Length") file_size = None if meta_length: file_size = int(meta_length[0]) print("Downloading: {0} Bytes: {1}".format(url, file_size)) file_size_dl = 0 block_sz = 8192 while True: buffer = u.read(block_sz) if not buffer: break file_size_dl += len(buffer) f.write(buffer) status = "{0:16}".format(file_size_dl) if file_size: status += " [{0:6.2f}%]".format(file_size_dl * 100 / file_size) status += chr(13) print(status, end="") print() return filename if __name__ == "__main__": # Only run if this file is called directly print("Testing with 10MB download") url = "http://download.thinkbroadband.com/10MB.zip" filename = download_file(url) print(filename)
爲此,在純Python中編寫了wget庫。 從2.0版開始, urlretrieve
具備這些功能 。
這可能有點晚了,可是我看到了pabloG的代碼,不由添加了一個os.system('cls')使其看上去真棒! 看看這個 :
import urllib2,os url = "http://download.thinkbroadband.com/10MB.zip" file_name = url.split('/')[-1] u = urllib2.urlopen(url) f = open(file_name, 'wb') meta = u.info() file_size = int(meta.getheaders("Content-Length")[0]) print "Downloading: %s Bytes: %s" % (file_name, file_size) os.system('cls') file_size_dl = 0 block_sz = 8192 while True: buffer = u.read(block_sz) if not buffer: break file_size_dl += len(buffer) f.write(buffer) status = r"%10d [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size) status = status + chr(8)*(len(status)+1) print status, f.close()
若是在Windows之外的環境中運行,則必須使用「 cls」之外的其餘名稱。 在MAC OS X和Linux中,應該「清楚」。
源代碼能夠是:
import urllib sock = urllib.urlopen("http://diveintopython.org/") htmlSource = sock.read() sock.close() print htmlSource