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」,頁面跳轉地址欄里鏈接變成 https://www.pexels.com/search/water/?page=2
熟悉的感覺,這幾個圖好像剛剛那個頁面也出現過。。。
回第一頁源碼中數了下,一共才發現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 這個爬蟲還是可以的,就是速度太慢了了,等學了多線程再回來優化。----------------------------------------------------這是分隔線--------------------------------------------------------
往期文章:
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 抓取網頁亂碼原因分析