寫只爬蟲,把Unsplash的2W攝影素材扒個精光(內附下載地址)

事情的開端是這樣的,本人一直很喜歡高質量的攝影分享網站,常常混跡於500px.com等網站。很多國外攝影高手拍出來的片都非常漂亮,很值得讓人學習。我偶爾也會偷一兩張下來當桌面(大霧)。好的東西總想把它佔為己有是人之常情。

可是這樣子盜圖是是不對的。幸運的是,我找到了一個幾乎同樣高端的攝影網站:Unsplash.com(Unsplash | Free High-Resolution Photos)。這個網站提供無限制的版權服務。也就是說,你可以使用網站的所有圖片做任何事情,包括商業用途。這簡直正中我下懷。

放幾張圖感受下攝影師的水平。

風景類:

人物類(這張好像很經典):

動物類(那就祝你雞年大吉,吧):

剛發現這個網站時候我超級高興,畢竟無版權而又那麼高質量的圖片真的很難找。所以我決定寫個爬蟲,把照片都挪到自己的硬碟裡面。

然後折騰了兩天,走了一點彎路。和大家分享一下。

最初的想法都是寫爬蟲的老套路了,按照以往經驗,基本上都是在python上用scrapy+urllib兩個模塊。首先拿到HTML文檔,用scrapy分析一下節點規則,用正則表達式把圖片的網址提取出來。再用urllib模塊進行下載。

結果在分析HTML時候意外發現了網站的API(Unsplash | High-Resolution Photos),那問題就更簡單了。直接在網站上調用申請到的KEY就可以把圖片網址全部拿到了。

然而我還是too naive,註冊好應用程序後API的調用次數是有限制的(見:unsplash.com/documentat)。每個小時的請求量不得超過50個,那就有點讓人絕望了。看了一下文檔的其他內容,發現有個List Collections的功能(unsplash.com/documentat),用JSON的格式返回照片列表。該API的GET的參數有page,per_page。嘗試枚舉,發現最大的per_page(每頁顯示的照片數量)為30張,page(頁碼)最大值為690,所以整站大概有2W張攝影作品。如果使用自己申請到的KEY進行查詢,完整獲得網站的攝影作品List需要大概14小時。由於網站作品的質量比較高,每張作品的大小大概在5MB左右,粗略估計整站攝影作品佔用的總空間為100GB左右。

如果用自己的Key獲取List,那速度也太慢了,所以我希望能找到更快的解決方案。

正好Unsplash推出了一款名為Unsplash Instant的Chrome插件(地址:Unsplash Instant,需要翻牆進入Chrome商城)。覺得蠻有趣的,安裝了一個。

安裝完成後嘗試尋找保存在插件中的Public Key,發現其保存在了插件目錄下的2.0.1_0jsmain.js文件中。雖然JS代碼經過壓縮,但並不難找。其官方的Client_ID為:

fa60305aa82e74134cabc7093ef54c8e2c370c47e73152f72371c828daedfcd7n

現在相當於拿到了主人家的鑰匙,想幹什麼幹什麼。

那麼先把所有的List遍歷下來吧。

先上代碼為敬。

上面代碼中比較有意思的部分是lambda函數,實現了傳入多個參數到回調函數的功能,這樣我可以通過控制信號量保證多線程運行的self.toDB()不會因為同時需要寫入文件而產生資料庫lock的Exception。

跑完後可以用Navicat Prenium看看裡面的內容。通過對ID進行降序排列可以看到保存到的鏈接一共有20807張。

和之前預計的大概2W張吻合,網址抓取完畢。

到下載部分。

上代碼為敬。

實驗室的網路是100Mbps,可以看到400線程大概佔用了40%的寬頻,由於Unsplash的伺服器在國外,這個速度已經算很不錯了。如果以5MB/s的下載速度計算,每張照片5MB,一共有2W張照片的話,完全下載完畢需要大概要5個半小時。

爬完後用Bridge打開,大概是這樣的。。。

照片超級多,縮略圖都生成了半天。。。。

按照這攝影作品庫的數量(20807張),如果我一天換一張的話,我可以換差不多六十年。。。

最後放上本項目的Github地址:hating/UnsplashDownloader,祝大家玩的開心。

爬完全部照片大小為125GB,無任何版權,請自由使用。

鏈接:pan.baidu.com/s/1cCazYu 密碼:lgug

還有,歡迎來Star呀~

<EOF>


推薦閱讀:

快速實現業務需求:不重複扣費
有什麼比較好的Computer Graphics的國外論壇或國外課程介紹?
C/C++中switch語句為什麼匹配到標籤後不跳出?
初學者學ios編程的過程中,如何處理ios、xcode的版本差異?
軟體開發到底是工程還是藝術,還是科學?

TAG:爬虫 | 素材 | 编程 |