Python3--妹子圖實戰

Chris_iven發表於2018-04-17

這個專案是我自己想做的,我並沒有自行去看其他人的部落格,只是單純有這個想法.

注:本文使用的模組不多,思路也很簡單.幾乎都是鏈式爬取的,也可以叫做是深度爬取,即是一個連結接著下一個連結!

等你們看完程式碼,你們都會驚訝,這麼簡單!!!!

哈哈,是的!!


廢話不多說,直接上步驟!

1.毫不遲疑就是分析網站的結構啦:


首先點進去開啟首頁,點進去第一個套圖的網址,

發現,第一張圖片的連結是:http://www.mzitu.com/130071,而最後一張是http://www.mzitu.com/130071/49

顯然是以http://www.mzitu.com/130071就是圖片合集的下標0了!找到這個就好辦了,我們再次分析圖片的結尾下標!結尾下標是:http://www.mzitu.com/130071/49,一共50張!

然後在去分析下一組這個url,發現一個更大的驚喜.

的連結是:http://www.mzitu.com/130023,而對應首頁上的第二個套圖連結!


分析完這個就好辦了,那麼我現在有思路了

說下,首先,這個網站的連結分佈類似於火車節的那種,只要你找到頭,就能通過頭一直查詢下去,直到網站的底部.

思路:

    1.開啟一個套圖的URL(頭),解析出這個網頁內部的img圖片地址,下載這個img圖片.

    2.讓其尋找下一頁的url!再次開啟,下載,再次尋找下一頁的url....以此類推!直到找到網站的底部位置!

    但是問題來了,該怎麼去實現呢?

來一串虛擬碼:

def Get_thelink_and_next_link(url):

    開啟url,獲取網頁呈現後的結果.

    解析出三個重要資訊:

        1.這個頁面的妹子圖連結.

        2.下一頁的妹子圖連結.

        3.解析出妹子圖的名稱(這個在儲存有用.)

    下載 妹子圖片連結

    儲存到本地 記得把妹子圖的名稱加上.

    一直重複

那麼開始!!!


首先匯入我們所需要的庫檔案.

我這裡是通過requests這個第三方庫來實現這個程式碼.

import requests#開啟網頁,進行下載時所用

import re#解析時用

from requests.exceptions import ConnectionError,HTTPError#捕捉錯誤


我們定義了函式,get_links_img()

裡面的功能包括,開啟網頁並且解析出剛才說的三個重要的資訊.

    圖片的連結

    該頁面的下一頁

    妹子圖的名稱

我這裡是完全通過re模組來去解析的.然後注意下那個Splite(),這個函式就是解析下一頁的url裡面帶上的雙引號""!


解析過後便是提示和下載圖片

我們在這用requests.get()開啟剛剛解析出的圖片連結,然後獲取這個圖片連結的二進位制.

通過檔案讀寫的方式寫入到本地.

自此,整個函式的功能執行差不多執行完畢.

還差最最關鍵的一步,就是返回已經解析好的下一頁的連結.

為什麼要返回?

因為返回才能執行爬取下一頁的功能!


有很多人可能想到我這樣的程式碼結構,會用遞迴函式去實現爬取.

這裡我得誇你,真的,你能想到遞迴,就意味著你能想到比遞迴更好的解決這個函式執行的方法.

    我一開始就是使用遞迴,然後程式越跑越慢,執行效率極其低下.

    然而,網際網路是多麼得偉大,我嘗試去查詢解決方案.終於讓我找到了.

    看圖!


現在知道為什麼要返回下一頁的連結了吧.

    簡單解析下:

    url = 連結

    while url:#如果url能用,那麼我就傳入到下面那個函式

        url = get_links_and_img(url)

    get_links_and_img()返回的這個url是能用的,我就在再次傳入到get_links_and_img(),如果不能用就直接停止.

然後執行結果...



怎麼樣?是不是很簡單?

了了70行程式碼,一個非常簡單的爬蟲就完成了..

其實爬蟲學的不是方法,而是思路.我個人認為,一個網站怎樣爬取,不是看你怎麼爬,而是看這個網站的佈局.根據網站的佈局來進行程式碼編輯.

爬蟲怎麼去學才能學好?

    我個人給出的觀點是:與其在那看視訊學習,不如自己去實踐一番.動手才是王道.

如果你也喜歡爬蟲,如果你也喜歡技術,那麼歡迎你加入我們的群,我們歡迎熱愛技術的你

                                                    


群號碼:749511386

謝謝支援!!