說明:個人練手python用。
操作系統(tǒng):window10 x64
IDE:Pycharm 2017.2.2
Python版本:3.6.2
一、下載單個圖片
# 導入模塊
from urllib import request
# 指定要下載的圖片的地址
url = "http://pic.qiantucdn.com/images/banner/59ad4e6c86b91.jpg"
# 發(fā)送請求
request = request.urlopen(url)
# 獲取返回結(jié)果
response = request.read()
# 創(chuàng)建一個圖片文件,名稱和圖片原名稱一致
f = open("C:/python_test/"+url.split("/")[-1],"wb")
# 寫入數(shù)據(jù)
f.write(response)
# 關(guān)閉文件
f.close()
其中最后三句代碼也可以簡化如下:
with open("C:/python_test/"+url.split("/")[-1],"wb") as f:
f.write(response)
使用with關(guān)鍵字,就不需要關(guān)閉流了。
二墓毒、下載整頁圖片
# urllib是庫,request中該庫中的模塊亲怠,用于發(fā)送HTTP請求
import urllib.request
# 引入正則表達式模塊
import re
# 網(wǎng)頁地址所计,里面包含眾多圖片,需要寫正則篩選出來
url = "http://www.58pic.com/piccate/5-145-0.html"
# 發(fā)送請求
req = urllib.request.urlopen(url)
# 接收相應(yīng)的內(nèi)容
res = req.read()
# 將相應(yīng)的內(nèi)容轉(zhuǎn)為字符串類型
res = repr(res)
# 正則表達式 前面的一個 r 表示字符串為非轉(zhuǎn)義的原始字符串团秽,讓編譯器忽略反斜杠主胧,也就是忽略轉(zhuǎn)義字符
# \S匹配任意非空字符 *表示0-n次
regex = r'http://[\S]*.jpg'
# 將正則表達式編譯為正則表達式對象叭首,用于提高匹配效率
pattern = re.compile(regex)
# 使用編譯好的正則對象調(diào)用findall方法,篩選出所有符合正則的數(shù)據(jù)踪栋,結(jié)果為list類型
get_image = pattern.findall(res)
# 定義臨時變量焙格,用于命名下載的圖片
page = 1
for image in get_image:
# urlretrieve用于將遠程數(shù)據(jù)下載到本地
urllib.request.urlretrieve(image, "C:/python_test/"+"%s.jpg" % page)
page += 1
三、顯示下載進度
這里的urlretrieve方法定義如下:
urlretrieve(url, filename=None, reporthook=None, data=None)
- 1己英、第一個參數(shù)表示要下載的資源的地址
- 2间螟、第二個參數(shù)表示保存的路徑及名稱
- 3、第三個參數(shù)是一個回調(diào)函數(shù)损肛,當連接上服務(wù)器、以及相應(yīng)的數(shù)據(jù)塊傳輸完畢時會觸發(fā)該回調(diào)荣瑟,我們可以利用這個回調(diào)函數(shù)來顯示當前的下載進度治拿。
- 4、第四個參數(shù)表示post到服務(wù)器的數(shù)據(jù)
該方法返回一個包含兩個元素(filename, headers)的元組笆焰,filename 表示保存到本地的路徑劫谅,header 表示服務(wù)器的響應(yīng)頭對象信息。如下:
('C:/python_test/34.jpg', <http.client.HTTPMessage object at 0x00000261B634AEB8>)
下面我們使用一下該函數(shù)嚷掠,去下載網(wǎng)絡(luò)上的一個文件捏检,同時顯示下載進度:
import urllib.request
# 回調(diào)函數(shù)定義
def callback(a, b, c):
'''
:param a: 已經(jīng)下載的數(shù)據(jù)塊的個數(shù)
:param b: 數(shù)據(jù)塊的大小,值是8192
:param c: 遠程文件的大小
'''
per = 100.0 * a * b / c
if per > 100:
per = 100
print('%.2f%%' % per)
# 指定下載文件的地址
url = "http://sw.bos.baidu.com/sw-search-sp/software/3756358c42c34/npp_7.5.1_Installer.exe"
# 指定存儲的路徑和名稱
filename = "c:/python_test/notepad++.exe"
# 下載
urllib.request.urlretrieve(url, filename, callback)