爬了下Unsplash上的高清壁紙,總有一款適合你

  • 2019 年 10 月 8 日
  • 筆記

作者 | shenzhongqiang

來源 | Python與數據分析

Unsplash是個高清攝影圖片的網站,裡面的照片非常精美,解析度也很高,最重要的是,所有的照片都沒有版權,無須向原作者申請授權,即可任意使用。

最近閑暇的時候寫了個爬蟲爬了下Unsplash上的那些高贊的壁紙。爬蟲原理非常簡單,就是爬取所有的壁紙,然後篩選那些贊數最高的圖片。

程式碼實現

第一步我們爬取Unsplash所有的壁紙圖片資訊,並存入MongoDB,程式碼如下

def get_image_by_page(page_no):     url = "https://unsplash.com/napi/collections/1065976/photos?page={}&per_page=10&order_by=latest&share_key=a4a197fc196734b74c9d87e48cc86838".format(page_no)     r = requests.get(url, verify=False)     data = r.json()     return datadef get_images():     page_no = 1     client = pymongo.MongoClient()     db = client["unsplash"]     while True:         result = get_image_by_page(page_no)         if len(result) == 0:             break         db.wallpaper.insert_many(result)         print(page_no)         page_no += 1         time.sleep(10)

爬下來的數據裡面包含了幾個重要的欄位。

我們最關心的就是likes這個欄位,這個裡面存了圖片的贊數,後續我們篩選高贊圖片的時候會用到。

還有兩個欄位分別是width和height,這是圖片的寬度和高度,因為我們這裡關注的是桌面壁紙,所以只關心寬度大於高度的那些壁紙。

爬完圖片資訊後,接下來我們從資料庫篩選高贊圖片,程式碼如下

def get_top_liked_images():     client = pymongo.MongoClient()     db = client["unsplash"]     cursor = db.wallpaper.aggregate([         {"$match": {"likes": {"$gte": 1000}}}     ])   path = os.path.dirname(__file__)     path = os.path.join(path, "wallpaper")     for item in cursor:         url = item["urls"]["raw"]         width = item["width"]         height = item["height"]         if width <= height:             continue         r = requests.get(url, verify=False)         filename = "{}.jpg".format(int(time.time()))         filepath = os.path.join(path, filename)         with open(filepath, "wb") as f:             f.write(r.content)         print(filepath)         time.sleep(10)

這裡我們會根據圖片資訊里的URL去下載圖片。需要注意的是,如果過於頻繁的爬取Unsplash,會導致爬蟲被封,所以這裡每次下載完都會睡個10秒鐘。

Exit mobile version