1. 程式人生 > 實用技巧 >Python 通過Bing桌布介面獲得UHD解析度的桌布

Python 通過Bing桌布介面獲得UHD解析度的桌布

前言

買了新的2K顯示器之後,1080p的桌布已經無法滿足了,2K顯示器看桌布都糊了:(,但還是喜歡每日一更新的bing桌布。這個時候怎麼辦呢?我看網上每個玩家做bing桌布同步都是有超高清的桌布可以下載的,不過都需要登入才能下載超高清桌布,不登入的就只能下載1080p解析度的,難受!既然他們的超高清桌布也是通過bing桌布介面獲得的,那或許我也能通過介面下載:D。

經過分析,我發現只需要將獲得的桌布url中的“1920x1080”改為“UHD”,就可以獲得超高清的桌布了,不過解析度並不是固定的4K,也可能是8K的,如下檢視bing的html原始碼。

接下來就是程式碼時間了!

Python獲取連結並下載

分析json

通過bing桌布介面獲得的json如下,由於資料比較多,做了以下簡略,images節點下的每一個子元素的url就是圖片的連結,不過是1080p的,而且url最前面沒有加上bing的域名

 1 {
 2   "images": [
 3     {
 4       "startdate": "20201003",
 5       "fullstartdate": "202010031600",
 6       "enddate": "20201004",
 7       "url": "/th?id=OHR.MontageJupiterIo_ZH-CN2512372897_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp
", 8 "urlbase": "/th?id=OHR.MontageJupiterIo_ZH-CN2512372897", 9 "copyright": "木星及木衛一的蒙太奇影象 (© NASA/Johns Hopkins University Applied Physics Laboratory/Southwest Research Institute/Goddard Space Flight Center)", 10 "copyrightlink": "/search?q=%e6%9c%a8%e6%98%9f&form=hpcapt&mkt=zh-cn
", 11 "title": "", 12 "quiz": "/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20201003_MontageJupiterIo%22&FORM=HPQUIZ", 13 "wp": true, 14 "hsh": "03b3a0c34dbb46fb90f4e3cdd2890ced", 15 "drk": 1, 16 "top": 1, 17 "bot": 1, 18 "hs": [] 19 }, 20 ... ... 21 ], 22 "tooltips": { 23 "loading": "正在載入...", 24 "previous": "上一個影象", 25 "next": "下一個影象", 26 "walle": "此圖片不能下載用作桌布。", 27 "walls": "下載今日美圖。僅限用作桌面桌布。" 28 } 29 }

下載圖片

下面的程式碼示例使用到了requestsjsonpath這兩個框架,如果還沒有安裝的,先使用pip安裝

pip install requests jsonpath

接下來是python程式碼

 1 import requests
 2 from jsonpath import jsonpath
 3 from time import time
 4 from json import load
 5 from os.path import exists
 6 
 7 # 模擬瀏覽器User-Agent
 8 headers = {
 9     'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Edg/85.0.564.70'
10 }
11 
12 
13 def get_wallpaper_urls():
14     """獲取圖片連結"""
15     # 隨機時間戳
16     timestamp = time()
17     r = requests.get(
18         url=f"https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=8&nc={int(timestamp * 1000)}&pid=hp",
19         headers=headers
20     )
21     # print(r.json())
22     # 儲存圖片json
23     with open('bing-wallpaper.json', 'wb') as f:
24         f.write(r.content)
25 
26     print('done')
27 
28 
29 def collect(s=''):
30     """處理圖片連結,將1080p替換為UHD的超高清格式,並且拼接上bing的域名"""
31     return 'https://cn.bing.com' + s.replace('1920x1080', 'UHD')
32 
33 
34 def parse_json(file_path=None):
35     """解析圖片連結並下載"""
36     if file_path and exists(file_path):
37         wallpapers = {}
38         # 開啟下載好的json檔案
39         with open(file_path, 'rb') as f:
40             wallpapers = load(f)
41         # 解析提取所有的圖片連結
42         urls = jsonpath(wallpapers, '$.images[*].url')
43         if isinstance(urls, list):
44             # 處理圖片
45             urls = map(collect, urls)
46             # 下載圖片
47             for i in urls:
48                 download_images(i)
49 
50 
51 def download_images(image_url):
52     """下載圖片"""
53     r = requests.get(url=image_url, headers=headers)
54     # 做下判斷,忽略無法下載的圖片,或者說是無效的圖片連結
55     if r.status_code == 200 and 'image' in r.headers['content-type']:
56         print(f'download images for {image_url}')
57         # 這裡是根據圖片連結的特徵提取圖片檔名,其實也可以直接用時間戳來命名檔案,更快一些
58         image_url = image_url[30:].split('&')[0]
59         # 下載好的圖片儲存到當前py檔案同級的imgs目錄下
60         with open('imgs/' + image_url, 'wb') as f:
61             f.write(r.content)
62 
63 
64 if __name__ == '__main__':
65     get_wallpaper_urls()
66     parse_json('bing-wallpaper.json')

下載結果

下載好的桌布確實是超高清格式的,有4K的也有8K的