1. 程式人生 > >Python爬蟲下手,就得從高清美圖開始!

Python爬蟲下手,就得從高清美圖開始!

寫在前面

前幾天玩遊戲時,lol盒子右下角有條廣告,

廣告大概這個樣子

 

咦,小姐姐,還有cosplay,點進去看看。

哇,發現一個好玩的網站,好多漂亮的妹子,頁面開啟很流暢,點開後有的瀏覽頁面還有好聽的音樂,產品體驗極佳。

 

 

不過每組圖片只能看前幾張圖,後面的圖只能看到縮圖,如果想繼續看或者打包下載得花銀子,通常要1-5rmb。

 

ctrlC+ctrlV幾張後不樂意了,這麼儲存一來看不到全部圖片,二來,麻煩,太麻煩了。

俗話說,妹子是第一生產力,魯迅有云,懶人創造美好世界。

專案編寫

試試吧,看能不能發現點有趣的東東。首先習慣性的看看html原始碼,blabla一堆,頭大,pass。

 

從頁面原始碼來看,頁面應該是前端渲染出來的,直接解析爬蟲爬的話會比較麻煩。既然是前端渲染,那再看看請求吧,首頁肯定是載入相簿列表,沒啥大用處,直接看載入具體某一相簿的請求結果,點開某一相簿,跳過圖片,看看有沒有什麼可用的介面,果然有。

 

複製出來,瀏覽器走起,請求後返回如下資訊

 

很明顯是該相簿的詳細資訊獲取介面,可是怎麼有些像是被編碼過的東西。既然被編碼了,解碼出來瞧瞧,postman走起。postman順利解析出結果

 

上下翻翻看,發現了一個神奇的連結,是個zip壓縮包,嗯,有點意思。

 

下載回來解壓,哈哈,居然是該相簿的所有照片。

 

看返回的結果,很明顯使用了jsonp,於是接著試著減少引數,去除了返回結果中惱人的無用回掉字首,最後簡化到僅剩一個引數,id,這介面太呆萌了。

 

此外還發現了網頁上音樂的地址。

 

至此該網站的“核心資產”已經被扒的底褲都沒了,下面開始批量爬吧。

爬蟲思路

有兩種思路,一種是利用主頁呼叫的獲取相簿列表引數介面來獲得相簿列表再通過列表爬壓縮包地址,另外一種是直接從1開始依次嘗試到首頁最新的一個相簿對應的id。最終決定採用第二種思路,因為這樣即使首頁隱藏的相簿通過這種方式也能被發現。

開搞,建資料庫,資料表,為方便後續追加執行,以及放在伺服器上爬,所以採用springboot配合非同步呼叫來實現。一開始使用post方式進行呼叫,結果嘗試抓取了一兩百條後到資料庫一看,怎麼這麼多重複的啊,而且怎麼同一個id和我用postman直接調得到的結果不一致?很可能開反爬了。

轉變思路,postman採用的是get方式,所以程式試試也使用get方式進行呼叫,同時加入執行緒隨機睡眠時間和User-Agent請求頭,以此模擬普通使用者的瀏覽器訪問行為。bingo,順利的抓取到了正確的圖包名稱、下載地址地址、音樂名稱、音樂下載地址等資訊。

 

扔伺服器上爬吧。等了大概十幾分鍾,爬完後總共獲取到892條有效的圖包記錄,202條有效的音樂記錄。

 

 

爬到地址後可不能算結束,還得把真正的壓縮包都下載回來,寫個批量下載的方法,伺服器走起,然後便開始吭哧吭哧的下載,速度還行,能接近7MB/S。

 

 

從上午11點開始到晚上9點下載完成,總共耗時10個小時,從伺服器上全部下載回來吧。

 

 

經過漫長的等待後,終於下載完,寫了個指令碼統計結果,最終:總共獲取到了46187張圖片,大小36.5GB。

 

專案效果圖: