不用爬蟲也可以輕鬆獲取 unsplash 圖片

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

但是 unsplash 訪問速度是個大問題,我經常會因爲圖片無法加載而被勸退。

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

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

Source API

source api 提供的功能比較簡單。如果想獲取一張隨機圖片,可以訪問地址:

https://source.unsplash.com/random

這個地址會重定向到一張圖片的地址,可以通過響應直接獲取到一張圖片。

如果圖片太大,加載速度也會比較慢。你可以在 url 後面添加尺寸,控制返回的圖片大小:

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

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

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

小提示

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

你可以指定獲取某位作者的圖片。比如我特別喜歡 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.png
image.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 就可以啓動網站,還算比較方便。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章