不須要爬蟲也能輕鬆獲取 unsplash 上的圖片

我常常會使用 unsplash, 這裏面的圖片很是清爽,個人大多數文章的圖片都是在這個網上找的,雖然也有同類型網站,可是用過一段時間之後基本都放棄了,圖片質量良莠不齊,篩選過程太費勁。css

可是 unsplash 訪問速度是個大問題,我常常會由於圖片沒法加載而被勸退。html

今天一時手癢,順手搜了 unsplash api 這個關鍵字,看官方有沒有提供相關的 api 服務,還真有!前端

unsplash 提供了 2 個版本的 API。 一個是簡單版,主要是給小型應用,流量比較少的 app 使用,能夠經過 source.unsplash.com 進入;一個是進階版的開發者中心 API, 支持更多流量的 app 使用,能夠經過 unsplash.com/developers 進入。git

Source API

source api 提供的功能比較簡單。若是想獲取一張隨機圖片,能夠訪問地址:github

https://source.unsplash.com/random

這個地址會重定向到一張圖片的地址,能夠經過響應直接獲取到一張圖片。web

若是圖片太大,加載速度也會比較慢。你能夠在 url 後面添加尺寸,控制返回的圖片大小:json

https://source.unsplash.com/random/800x600

若是原圖片不是這種長寬比,unsplash 會對圖片進行裁剪,某些部分就會丟失。若是你想保持圖片的原始比例,能夠把高度設成 0 :flask

https://source.unsplash.com/random/800x0

小提示api

不管是什麼 API, 你均可以在最後使用 /800x0 這樣的方式控制圖片的大小。markdown

你能夠指定獲取某位做者的圖片。好比我特別喜歡 Raamin ka 拍攝的照片。

我能夠把它的用戶名小寫之後再去掉空格,添加到 /user 的後面:

https://source.unsplash.com/user/raaminka

這樣我就能獲取到這位做者拍攝的隨機妹子照片了。不要忘了,你一樣是能夠控制圖片尺寸的。

獲取某個用戶喜歡的照片:

https://source.unsplash.com/user/raaminka/like

unsplash api 還支持搜索。一般來講,我都會根據要寫的文章的主題在 unsplash 上搜索圖片。好比我要寫一篇關於加密的文章,那我就會去搜索 encryption 相關的圖片:

https://source.unsplash.com/800x0/?encryption

你也能夠組合多個不一樣的關鍵字。若是沒有圖片同時包含這些關鍵字,則會優先匹配最後的關鍵字。

https://source.unsplash.com/800x0/?encryption,girl

如今咱們每次訪問同一個 API, 獲得圖片都不同,由於是隨機生成的。可是若是咱們在每一個 API 的後面添加 /daily 或者 /weekly, 則能夠獲得固定的一張圖。須要注意,這並非說這些圖片更加熱門或者質量更高,只是天天/每週保持不變的隨機圖片而已。

https://source.unsplash.com/800x0/daily?sports

Developer API

source api 的功能有限,並且若是訪問頻率太快老是會返回相同的圖片。如今咱們來看一下更加專業的開發者 API。

開發者 API 不是立刻就可使用的。你須要先註冊成爲開發者,獲得一個 access token, 以後你能夠經過這個 token 訪問 API:

https://api.unsplash.com/photos?client_id=fowflsfg

這個 API 還支持 3 個參數

param Description
page 第幾頁
per_page 每頁的圖片數量
order_by 排序 (能夠是: latest, oldest, popular; 默認是: latest)

其餘的 api 文檔你均可以在官網上查看到,這裏不復制粘貼了。developer api 相比 resource api 的好處在於他能夠同時提供多張圖片,同時能獲取到豐富的信息,好比做者,日期,大小等等。

在 unsplash 的主頁只能看到編輯推薦的圖片。沒有最新的和流行的能夠看,因此我寫了個簡陋的外殼查看最新和流行的圖片。

首先定義一個函數獲取圖片:

def get_photos(order_by='popular', page=1, per_page=50):
    """經過developer api 獲取圖片。"""
    session = requests.Session()
    url = 'https://api.unsplash.com/photos'
    params = {
        "client_id""your access token",
        "order_by": order_by,
        "page": page,
        "per_page": per_page
    }
    resp = session.get(url, params=params).json()
    return resp

這樣我能夠獲得 50 張圖的 url 地址。

image.pngimage.png

接下來使用 flask 搭建一個簡易服務:

app = Flask(__name__)

@app.route('/')
def index():
    pictures = get_photos()
    return render_template('index.html', pictures=pictures)

if __name__ == '__main__':
    app.run()

直接把圖片地址返回給前端頁面:

{% for pic in pictures %}
 <a href="{{ pic.urls.regular }}">
  <img src="{{ pic.urls.small }}">
    </a>
{% endfor %}

這樣我經過訪問本地的 http://localhost:5000 就能夠看到不少的圖片。我沒有對圖片展現效果進行任何的美化,這種凌亂的風格其實也挺好看的。後面若是用得多我在用 css 框架去作一下頁面佈局。

當我點擊一張圖片時,則能夠進入這張圖片的大圖地址,而且能夠直接做爲連接地址應用到 markdown 當中,而在 unsplash 官方網站上不能直接獲取連接地址。

最後補充一點。這個小應用只是做爲 unsplash 網站訪問很是慢的時候一個備選,並不能真正代替官網。對於圖片的篩選和分類搜索操做,官網提供了很是人性化的操做,我就不重複造輪子了。對於這個備選服務,我把他設成了命令行形式,只須要在命令行輸入 unsplash 就能夠啓動網站,還算比較方便。

點擊 閱讀原文 獲取完整代碼。

相關文章
相關標籤/搜索