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的域名

{
  "images": [
    {
      "startdate": "20201003",
      "fullstartdate": "202010031600",
      "enddate": "20201004",
      "url": "/th?id=OHR.MontageJupiterIo_ZH-CN2512372897_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp",
      "urlbase": "/th?id=OHR.MontageJupiterIo_ZH-CN2512372897",
      "copyright": "木星及木衛一的蒙太奇圖像  (© NASA/Johns Hopkins University Applied Physics Laboratory/Southwest Research Institute/Goddard Space Flight Center)",
      "copyrightlink": "/search?q=%e6%9c%a8%e6%98%9f&form=hpcapt&mkt=zh-cn",
      "title": "",
      "quiz": "/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20201003_MontageJupiterIo%22&FORM=HPQUIZ",
      "wp": true,
      "hsh": "03b3a0c34dbb46fb90f4e3cdd2890ced",
      "drk": 1,
      "top": 1,
      "bot": 1,
      "hs": []
    },
    ... ...
  ],
  "tooltips": {
    "loading": "正在加載...",
    "previous": "上一個圖像",
    "next": "下一個圖像",
    "walle": "此圖片不能下載用作壁紙。",
    "walls": "下載今日美圖。僅限用作桌面壁紙。"
  }
}

下載圖片

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

pip install requests jsonpath

接下來是python代碼

import requests
from jsonpath import jsonpath
from time import time
from json import load
from os.path import exists

# 模擬瀏覽器User-Agent
headers = {
    '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'
}


def get_wallpaper_urls():
    """獲取圖片鏈接"""
    # 隨機時間戳
    timestamp = time()
    r = requests.get(
        url=f"https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=8&nc={int(timestamp * 1000)}&pid=hp",
        headers=headers
    )
    # print(r.json())
    # 保存圖片json
    with open('bing-wallpaper.json', 'wb') as f:
        f.write(r.content)

    print('done')


def collect(s=''):
    """處理圖片鏈接,將1080p替換為UHD的超高清格式,並且拼接上bing的域名"""
    return 'https://cn.bing.com' + s.replace('1920x1080', 'UHD')


def parse_json(file_path=None):
    """解析圖片鏈接並下載"""
    if file_path and exists(file_path):
        wallpapers = {}
        # 打開下載好的json文件
        with open(file_path, 'rb') as f:
            wallpapers = load(f)
        # 解析提取所有的圖片鏈接
        urls = jsonpath(wallpapers, '$.images[*].url')
        if isinstance(urls, list):
            # 處理圖片
            urls = map(collect, urls)
            # 下載圖片
            for i in urls:
                download_images(i)


def download_images(image_url):
    """下載圖片"""
    r = requests.get(url=image_url, headers=headers)
    # 做下判斷,忽略無法下載的圖片,或者說是無效的圖片鏈接
    if r.status_code == 200 and 'image' in r.headers['content-type']:
        print(f'download images for {image_url}')
        # 這里是根據圖片鏈接的特征提取圖片文件名,其實也可以直接用時間戳來命名文件,更快一些
        image_url = image_url[30:].split('&')[0]
        # 下載好的圖片保存到當前py文件同級的imgs目錄下
        with open('imgs/' + image_url, 'wb') as f:
            f.write(r.content)


if __name__ == '__main__':
    get_wallpaper_urls()
    parse_json('bing-wallpaper.json')

下載結果

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

下載好的壁紙


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM