最近貌似對好看的圖著迷,Pixabay爬不到原圖不甘心呀。
百度+知乎了下,于是轉(zhuǎn)向pexels,同樣一個(gè)高人氣圖片網(wǎng)站。
顏值逆天,畫質(zhì)不輸Pixabay,瞬間感覺有了動(dòng)力?
不到一下午就爬到高清原圖,僅用re\requests幾個(gè)庫,隨后又做了個(gè)下載器。
之前的博文泛泛帶過的多,總感覺少了點(diǎn)什么,這次詳細(xì)記錄一下。
</br>
一、過程
1、分析查看
首先點(diǎn)擊進(jìn)入官網(wǎng) https://www.pexels.com/ ,又見瀑布流,點(diǎn)擊查看源碼。

看到后面這一串,便可知曉網(wǎng)頁有嵌入javascript腳本。由于前面踩過坑,立即用requests庫檢查了下,發(fā)現(xiàn)可以正常返回源碼中數(shù)據(jù),松了一口氣。(爬取網(wǎng)站前先檢查一下其反爬策略還是很有必要的,之前就曾遇到過返回亂碼或者什么都沒有的情況)
</br>
2、獲取原圖地址
搜索框中輸入'water',頁面跳轉(zhuǎn)到如下:

查看源代碼和首頁差不多,接著是圖片真實(shí)地址鏈接。我在這里繞了幾個(gè)彎,具體不敘述。
加上前面pixabay的坑,最后得到經(jīng)驗(yàn):直接點(diǎn)擊官方下載按鈕,從對話框中看到圖片真實(shí)鏈接,這是最保險(xiǎn)的模式。(因?yàn)橛袝r(shí)“查看模式”并不能提供真實(shí)鏈接,而且有時(shí)也并不能下載得到。)
最后發(fā)現(xiàn)真實(shí)地址有兩種形式,還發(fā)現(xiàn)圖片有jpg和jpeg兩種格式:


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

有些圖并不能打開,又得到教訓(xùn):爬蟲爬下的圖打不開時(shí),有可能鏈接地址是錯(cuò)的。

對比源碼,發(fā)現(xiàn)'data-pin-media'和'src'中皆含地址鏈接數(shù)據(jù),用正則提取,再將images換成static即為鏈接。圖片格式有兩種,為了方便后面命名,我還是分成了兩段來取。用最簡單的(.*?),結(jié)果又出問題了:
#正則是這樣的
pattern=re.compile(r'<img.*?data-pin-media="https://images.pexels.com/photos/(.*?)/(.*?)?w=800.*?>',re.S)
items=re.findall(pattern,result)

每個(gè)鏈接后面都多了個(gè)'?',如何去掉字符串最后一位字符,我記得string類是沒有像list類的pop()方法的,又考驗(yàn)python基礎(chǔ)。不過這個(gè)簡單啦~
for item in items:
print 'https://static.pexels.com/photos/'+str(item[0])+'/'+str(item[1][:-1])
</br>
3、批量下載
這特么才是關(guān)鍵??!
網(wǎng)頁使用瀑布流模式,是沒有頁碼的,無法像之前那樣一頁一頁遍歷。selenium還不熟練,這下如何是好。又倒回去看源碼。 然后發(fā)現(xiàn)了這一堆!

點(diǎn)擊源碼中href="/search/water/?page=2",頁面跳轉(zhuǎn)

地址欄里鏈接變成 https://www.pexels.com/search/water/?page=2
熟悉的感覺,這幾個(gè)圖好像剛剛那個(gè)頁面也出現(xiàn)過。。。
回第一頁源碼中數(shù)了下,一共才發(fā)現(xiàn)15張縮略圖的鏈接。
然后全明白了,回page1一數(shù)正好吻合。
原來獲取圖片接口在源碼里啊,每一頁15張,308就是最大頁數(shù)了。
接著就簡單了,又可以循環(huán)遍歷,避開瀑布流啦_
試著下載圖片,結(jié)果又出幺蛾子了:

目測是爬蟲被網(wǎng)站發(fā)現(xiàn)了,只好將urllib2改為requests的get方式,設(shè)置user_agent和header, user_agent還設(shè)了隨機(jī)數(shù),爬完一頁time.sleep(3)。
通過。
最后查了一下,有個(gè)帖子總結(jié)的很好。

</br>
最后用之前Pixabay的模版又做了個(gè)下載器。
</br>
二、結(jié)果
最后來看下結(jié)果
已經(jīng)存在的圖自動(dòng)跳過。



強(qiáng)迫癥患者,終于等到10頁圖全部下載完才睡。。。
本來準(zhǔn)備隨便拿個(gè)圖看效果
結(jié)果太大了上傳不了。。。。
(比如上圖第一排最右邊的那個(gè)圖就有27M)

三、代碼
源碼我上傳到Github了:
https://github.com/LUCY78765580/Python-web-scraping/blob/master/pexels.py
這個(gè)爬蟲還是可以的,就是速度太慢了了,等學(xué)了多線程再回來優(yōu)化。