網路資料擷取中,如何大量或抓取網頁(站)中的圖片,是網路資料擷取常被應用的區塊之一。
而要如何「爬取」網站中的圖檔,這部分涉及到:
1.如何解析網站內容,抓取網戰中的圖檔資訊,這部分涉及到網站的讀取及解析工作。
2.解析出網站中的圖檔資訊後,即可以網站圖檔的url進行圖檔的抓取(下載、儲存)
這次呢~~我們依然先從分解動作中,比較單純的網路圖檔的下載及儲存(也就是上述的第2階段)下手!
瞭解了網路圖檔如何下載儲存後,後面再來介紹如何爬取、解析網站中的圖檔資訊(例如:解析google Doodle的歷史圖檔),二者結合起來之後~~就可以驅動程式去自動抓取指定網站中的所有圖檔了!
好~~這次主要就是針對如何將網路資料(本次以下載圖檔為例)下載到本地端為操作目標。
主要的工具就是python中 urllib.request 的 urlretrieve() 函數
有關 urllib.request 的 urlretrieve() 函數 的詳細說明,可以參考以下網站資料:
https://docs.python.org/3/library/urllib.request.html#module-urllib.request
我們這次就是使用 urllib.request 的 urlretrieve() 函數 來下載、儲存指定的網路圖檔,並使用OpenCV來讀取並顯示下載後的圖檔,作為整個操作的設計目標。
這次示範預設要下載的圖檔是google Doodle 網站中的:
https://www.google.com/doodles/first-day-of-school-2021-january-04
圖檔位址:
好囉~~~上程式碼囉:
# 抓取指定網路圖片的方法
from urllib.request import urlretrieve
import cv2
# 網路圖片url
img_url = 'https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png'
fpath = "imgs/"+img_url.split("/")[-1] # 設定儲存位置並以網路圖檔名稱為儲存檔名
urlretrieve(img_url, fpath) # 將遠端(網路)資料下載到本地
r_img = cv2.imread(fpath) # cv2讀取下載的圖檔
cv2.imshow("Net ImageUrl", r_img) # 以cv2呈現讀取的圖檔
cv2.waitKey(0)
cv2.destroyAllWindows()
程式執行後,就可以看到呈現下載的圖檔視窗,並在指定的路徑中看到下載的圖檔囉!
檔名由於我們指定以網路圖檔的檔名進行儲存,所以你會在指定的目錄下看到「first-day-of-school-2021-january-04-6753651837108833-2x.png」這個檔案。
後記:可能會有朋友質疑說~~啊~網路圖檔按「右鍵」選擇「另存圖片」就行了啊,為什麼要用程式這麼不人性的方法去抓取、下載咧????
這就要跟大家回顧一開始談到的~~我們的目標是希望能結合網站內容的爬取及解析,並透過程式去自動抓取網站中的所有(大量)的圖檔,而無須「人工」一筆、一筆的去點選下載!
程式的好處是可以將複雜、重複、大量的工作,透過程式設計去強化、快速並自動化的去完成我們指定的工作。
當然~~若你只是想單純下載幾張網路圖片,那真的不必這麼麻煩啦~~~按「右鍵」選擇「另存圖片」就行了!
沒有留言:
張貼留言