java爬取网页并保存_第九讲:Python爬取网页图片并保存到本地
上一講我們說了如何把網頁的數據通過分析后存儲到數據庫,我們這次講如何將網頁上的圖片提取并下載到本地。
思路如下:
我們本次要爬取的是昵圖網首頁的圖片。
1、首先分析我們要爬取的網頁的代碼結構,每個網頁的代碼結構都不大一樣,所以要做好分析。
我們進入昵圖網的首頁,http://www.nipic.com/index.html
按F12開啟瀏覽器的調試模式,可以通過鼠標看到圖片的后臺代碼:點擊調試的小箭頭,然后點擊對應的圖片,既可以看到圖片在頁面上對應的編碼。
或者,直接“查看源代碼”就可以看到整個網頁的源碼
我們可以在源代碼界面看到很多.jpg結尾的圖片
我們可以直接通過查找來查看到底有多少張圖片在頁面上,我本次用的是360瀏覽器,每個瀏覽器的使用方法大同小異。
查找的快捷方式是Ctrl+F ?同時按住兩個按鍵就可以在提示框中輸入查找的信息。
或者右擊菜單“查找”
在關鍵詞框中輸入".jpg"
我們可以看到,系統提示是14張圖片的鏈接。
2、編寫代碼,獲取網頁的圖片,首先我們要這個頁面的圖片的大體格式是怎樣的。
我們看下幾個圖片鏈接的代碼格式:
上面三張圖片的格式都是常見的:http://.......jpg,則我們可以把這個做成正則表達式的形式如:http:\S{1,}.jpg
則,我們利用前面兩講的代碼,編寫如下:
3、效果如下:
點擊運行后,系統自動在D盤的image文件夾下載對應的圖片
最終下載完后:
最后,其實你網速快的話,程序不設置休眠也可以。
最后,總結下我們本次用到的新知識:
1、函數: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表示服務器的響應頭。
2、time.sleep(secs)
Python time sleep() 函數推遲調用線程的運行,可通過參數secs指秒數,表示進程掛起的時間。
3、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。
4、b=a.split('/')[-1]
我們不確定圖片鏈接的長度,所以如果從左邊開始取下標,則最后一個文件名的下標值是不一樣的,不好操作,但是如果寫的是-1,則說明要取得是右邊第一個。
本節課沒有課堂視頻,因為新的教室沒有帶多余的麥克風。
總結
以上是生活随笔為你收集整理的java爬取网页并保存_第九讲:Python爬取网页图片并保存到本地的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6.6.1最优二叉树(赫夫曼树)
- 下一篇: 讯飞C/C++语音合成基础篇