上一講咱們說了如何把網頁的數據經過分析後存儲到數據庫,咱們此次講如何將網頁上的圖片提取並下載到本地。html
思路以下:正則表達式
咱們本次要爬取的是暱圖網首頁的圖片。數據庫
一、首先分析咱們要爬取的網頁的代碼結構,每一個網頁的代碼結構都不大同樣,因此要作好分析。瀏覽器
咱們進入暱圖網的首頁,http://www.nipic.com/index.html服務器
按F12開啓瀏覽器的調試模式,能夠經過鼠標看到圖片的後臺代碼:點擊調試的小箭頭,而後點擊對應的圖片,既能夠看到圖片在頁面上對應的編碼。網絡
或者,直接「查看源代碼」就能夠看到整個網頁的源碼函數
咱們能夠在源代碼界面看到不少.jpg結尾的圖片post
咱們能夠直接經過查找來查看到底有多少張圖片在頁面上,我本次用的是360瀏覽器,每一個瀏覽器的使用方法大同小異。編碼
查找的快捷方式是Ctrl+F 同時按住兩個按鍵就能夠在提示框中輸入查找的信息。url
或者右擊菜單「查找」
在關鍵詞框中輸入".jpg"
咱們能夠看到,系統提示是14張圖片的連接。
二、編寫代碼,獲取網頁的圖片,首先咱們要這個頁面的圖片的大致格式是怎樣的。
咱們看下幾個圖片連接的代碼格式:
上面三張圖片的格式都是常見的:http://.......jpg,則咱們能夠把這個作成正則表達式的形式如:http:\S{1,}.jpg
則,咱們利用前面兩講的代碼,編寫以下:
三、效果以下:
點擊運行後,系統自動在D盤的image文件夾下載對應的圖片
最終下載完後:
最後,其實你網速快的話,程序不設置休眠也能夠。
最後,總結下咱們本次用到的新知識:
一、函數:urllib.urlretrieve(url[, filename[, reporthook[, data]]])
函數說明
將URL表示的網絡對象複製到本地文件。若是URL指向本地文件,則對象將不會被複制,除非提供文件名。返回一個元組()(filename,header),其中filename是能夠找到對象的本地文件名,header是urlopen()返回的對象的info()方法(用於遠程對象)。
第二個參數(若是存在)指定要複製到的文件位置(若是沒有,該位置將是一個生成名稱的tempfile)。第三個參數,若是存在,則是一個回調函數,它將在創建網絡鏈接時調用一次,而且在此後每一個塊讀取後調用一次。這個回調函數將傳遞三個參數;到目前爲止傳輸的塊計數,以字節爲單位的塊大小,以及文件的總大小。第三個參數多是-1,在舊的FTP服務器上,它不返回文件大小以響應檢索請求。
參數說明:
url:外部或者本地url
filename:指定了保存到本地的路徑(若是未指定該參數,urllib會生成一個臨時文件來保存數據);
reporthook:是一個回調函數,當鏈接上服務器、以及相應的數據塊傳輸完畢的時候會觸發該回調。咱們能夠利用這個回調函數來顯示當前的下載進度。
data:指post到服務器的數據。該方法返回一個包含兩個元素的元組(filename, headers),filename表示保存到本地的路徑,header表示服務器的響應頭。
二、time.sleep(secs)
Python time sleep() 函數推遲調用線程的運行,可經過參數secs指秒數,表示進程掛起的時間。
三、os.makedirs()函數
語法格式:
os.makedirs(name[, mode=0o777][, exist_ok=False])
遞歸目錄建立函數,和mkdir()很像,可是全部中間級目錄都要包含葉目錄。
遞歸建立目錄,題中應有之意即路徑中哪一層不存在,則自動建立。
區別於os.mkdir(path, mode=0o777, *, dir_fd=None),只建立最後一層的目錄。
name:所要建立的目錄
參數mode表示權限;
若是exist_ok是False(默認),當目標目錄(即要建立的目錄)已經存在,會拋出一個OSError。
四、b=a.split('/')[-1]
咱們不肯定圖片連接的長度,因此若是從左邊開始取下標,則最後一個文件名的下標值是不同的,很差操做,可是若是寫的是-1,則說明要取得是右邊第一個。
本節課沒有課堂視頻,由於新的教室沒有帶多餘的麥克風。