Python 網路爬蟲入門(四)— 破解pexels高清原圖 (附源碼)

小白的記錄,寫給自己,沒有任何編程基礎,C都沒學過。如何開啟Python學習之路,請看 人生苦短,我用Python(寫在前面) - 知乎專欄

最近貌似對好看的圖著迷,Pixabay爬不到原圖不甘心呀。

百度+知乎了下,於是轉向pexels,同樣一個高人氣圖片網站。

顏值逆天,畫質不輸Pixabay,瞬間感覺有了動力?

不到一下午就爬到高清原圖,僅用rerequests幾個庫,隨後又做了個下載器。

之前的博文泛泛帶過的多,總感覺少了點什麼,這次詳細記錄一下。

一、過程

1、分析查看

首先點擊進入官網,又見瀑布流,點擊查看源碼。

看到後面這一串,便可知曉網頁有嵌入JavaScript腳本。由於前面踩過坑,立即用requests庫檢查了下,發現可以正常返回源碼中數據,鬆了一口氣。(爬取網站前先檢查一下其反爬策略還是很有必要的,之前就曾遇到過返回亂碼或者什麼都沒有的情況)

2、獲取原圖地址

搜索框中輸入』water』,頁面跳轉到如下:

查看源代碼和首頁差不多,接著是圖片真實地址鏈接。我在這裡繞了幾個彎,具體不敘述。

加上前面pixabay的坑,最後得到經驗:直接點擊官方下載按鈕,從對話框中看到圖片真實鏈接,這是最保險的模式。(因為有時「查看模式」並不能提供真實鏈接,而且有時也並不能下載得到。)

最後發現真實地址有兩種形式,還發現圖片有jpg和jpeg兩種格式:

我第一次以為鏈接只有第二種,結果辛辛苦苦匹配正則下載的圖確是這樣的:

有些圖並不能打開,又得到教訓:爬蟲爬下的圖打不開時,可能鏈接地址是錯的。

對比源碼,發現』data-pin-media』和』src』中皆含地址鏈接數據,用正則提取,再將images換成static即為鏈接。圖片格式有兩種,為了方便後面命名,我還是分成了兩段來取。用最簡單的(.*?),結果又出問題了:

#正則是這樣的n pattern=re.compile(r<img.*?data-pin-media="https://images.pexels.com/photos/(.*?)/(.*?)?w=800.*?>,re.S)n items=re.findall(pattern,result)n

每個鏈接後面都多了個』?』,如何去掉字元串最後一位字元,我記得string類是沒有像list類的pop()方法的,又考驗Python基礎。不過這個簡單啦~

for item in items:n print https://static.pexels.com/photos/+str(item[0])+/+str(item[1][:-1])n

3、批量下載

這特么才是關鍵啊!

網頁使用瀑布流模式,是沒有頁碼的,無法像之前那樣一頁一頁遍歷。selenium還不熟練,這下如何是好。又倒回去看源碼。 然後發現了這一堆!

點擊源碼中href=」/search/water/?page=2」,頁面跳轉

地址欄里鏈接變成 pexels.com/search/water

熟悉的感覺,這幾個圖好像剛剛那個頁面也出現過。。。

回第一頁源碼中數了下,一共才發現15張縮略圖的鏈接。

然後全明白了,回page1一數正好吻合。

原來獲取圖片介面在源碼里啊,每一頁15張,308就是最大頁數了。

接著就簡單了,又可以循環遍歷,避開瀑布流啦^_^

試著下載圖片,結果又出幺蛾子了:

目測是爬蟲被網站發現了,只好將urllib2改為requests的get方式,設置user_agent和header, user_agent還設了隨機數,爬完一頁time.sleep(3)。

通過。

過後查了一下,有個帖子總結的很好。

最後用之前Pixabay的模版又做了個下載器。

二、結果

最後來看下結果

已經存在的圖自動跳過。

強迫症患者,終於等到10頁圖全部下載完才睡。。。

本來準備隨便拿個圖看效果

結果太大了上傳不了。。。。

(比如上圖第一排最右邊的那個圖就有27M)

三、代碼

源碼我上傳到Github了:

github.com/LUCY78765580

這個爬蟲還是可以的,就是速度太慢了了,等學了多線程再回來優化。

----------------------------------------------------這是分隔線--------------------------------------------------------

往期文章:

Python網路爬蟲入門(一)Python網路爬蟲入門(一)

Python網路爬蟲入門(二)python網路爬蟲入門(二)

Python網路爬蟲入門(三)Python網路爬蟲入門(三)

作者: waking_up88688

知乎專欄:Python 爬蟲實戰日記 - 知乎專欄

簡書專欄:Wakingup88688 - 簡書

博客專欄:Python 爬蟲實戰日記

大家也可以加小編微信:tszhihu (備註:Python),拉大家到 Python愛好者社區 微信群,可以跟各位老師互相交流。謝謝。

也可以關注微信公眾號:Python愛好者社區 (ID:python_shequ)

推薦閱讀:

Python · 樸素貝葉斯(三)· GaussianNB
Python數據處理 II:數據的清洗(預處理)
如何回答同學知道我在學 Python 時問我「會盜 QQ 號嗎」?
Python 抓取網頁亂碼原因分析

TAG:Python | 爬虫计算机网络 | Python入门 |