我這樣破解pexels獲取的高清原圖
打開界面是這樣
隨便搜索是這樣顏值逆天,畫質不輸Pixabay,瞬間感覺有了動力?
不到一下午就爬到高清原圖,僅用rerequests幾個庫,隨後又做了個下載器。之前的博文泛泛帶過的多,總感覺少了點什麼,這次詳細記錄一下。一、過程
1、分析查看
首先點擊進入官網 Free stock photos · Pexels ,又見瀑布流,點擊查看源碼。看到後面這一串,便可知曉網頁有嵌入javascript腳本。由於前面踩過坑,立即用requests庫檢查了下,發現可以正常返回源碼中數據,鬆了一口氣。(爬取網站前先檢查一下其反爬策略還是很有必要的,之前就曾遇到過返回亂碼或者什麼都沒有的情況)2、獲取原圖地址
搜索框中輸入water,頁面跳轉到如下:
查看源代碼和首頁差不多,接著是圖片真實地址鏈接。我在這裡繞了幾個彎,具體不敘述。
加上前面pixabay的坑,最後得到經驗:直接點擊官方下載按鈕,從對話框中看到圖片真實鏈接,這是最保險的模式。(因為有時「查看模式」並不能提供真實鏈接,而且有時也並不能下載得到。)最後發現真實地址有兩種形式,還發現圖片有jpg和jpeg兩種格式:
我第一次以為鏈接只有第二種,結果辛辛苦苦匹配正則下載的圖確是這樣的:有些圖並不能打開,又得到教訓:爬蟲爬下的圖打不開時,有可能鏈接地址是錯的。 #正則是這樣的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了:
https://github.com/LUCY78765580/Python-web-scraping/blob/master/pexels.py(如果您覺得有用,star一下我也可以喲~^_^)
四、總結
1、圖片介面隱藏在源碼中
2、經驗:圖片下載下來是壞的,或者打不開時,很有可能鏈接是錯的
3、爬蟲遇到403的幾種方法
通過這個小項目,可知分析源碼有多重要
本篇就是這樣了~
推薦閱讀:
※60秒GET小技能-爬蟲快速構建post參數法
※Python爬蟲技巧一之設置ADSL撥號伺服器代理
※從零開始寫Python爬蟲 --- 3.2 爬蟲實踐:獲取快代理
※python 高度魯棒性爬蟲的異常和超時問題
※基於微博數據用 Python 打造一顆「心」