我這樣破解pexels獲取的高清原圖

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

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

打開界面是這樣

隨便搜索是這樣

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

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

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

一、過程

1、分析查看

首先點擊進入官網 Free stock photos · Pexels ,又見瀑布流,點擊查看源碼。

看到後面這一串,便可知曉網頁有嵌入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",頁面跳轉

地址欄里鏈接變成 Water Images · Pexels · Free Stock Photos

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

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

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

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

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

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

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

通過。

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

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

二、結果

最後來看下結果

已經存在的圖自動跳過。

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

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

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

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

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

三、代碼

源碼我上傳到Github了:

github.com/LUCY78765580

(如果您覺得有用,star一下我也可以喲~^_^)

四、總結

1、圖片介面隱藏在源碼中

2、經驗:圖片下載下來是壞的,或者打不開時,很有可能鏈接是錯的

3、爬蟲遇到403的幾種方法

通過這個小項目,可知分析源碼有多重要

本篇就是這樣了~

推薦閱讀:

60秒GET小技能-爬蟲快速構建post參數法
Python爬蟲技巧一之設置ADSL撥號伺服器代理
從零開始寫Python爬蟲 --- 3.2 爬蟲實踐:獲取快代理
python 高度魯棒性爬蟲的異常和超時問題
基於微博數據用 Python 打造一顆「心」

TAG:Python | 爬虫 | 自学编程 |