DEV Community

Excalibra
Excalibra

Posted on

1

Entry-Level Bing Wallpaper Scraper

Preparatory Work

Analysis of Bing wallpaper web elements and API
To create an automated wallpaper downloader using Bing, we need to understand how to interact with the Bing API. The goal is to fetch wallpaper URLs and save them locally in the desired format. We'll also explore the relevant API, image elements, and URL patterns.

Key Components:

1. Bing's Wallpaper API:
Bing provides an endpoint to access its wallpaper metadata, including image URLs, titles, and descriptions. The primary endpoint we use is:

https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US

Enter fullscreen mode Exit fullscreen mode
  • idx=0: The index of the wallpaper (starting from today).
  • n=1: The number of wallpapers to fetch (in this case, just one).
  • mkt=en-US: The market/language code (in this case, English - US).

2. Image URL and Download:
The image URLs provided by the API are often in a relative format (starting with /th?id=...). To download the image, we'll need to prepend the base URL https://www.bing.com.

Format and Naming Convention:

The image URL will often be in the form:

/th?id=OHR.SouthPadre_ZH-CN8788572569_1920x1080.jpg
Enter fullscreen mode Exit fullscreen mode

We will process this to extract the necessary information, such as the image name and file extension, and save it accordingly.

Process

1. Fetching Data from Bing API:
The first step is to send a GET request to the Bing API. This returns a JSON object containing the metadata of the wallpaper for a given day.

import requests
import os

# Simulate browser request headers
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
}

# Directory to save wallpapers
default_pictures_dir = os.path.join(os.path.expanduser("~"), "Pictures")
picture_path = os.path.join(default_pictures_dir, "bing")

# Create the directory if it doesn't exist
if not os.path.exists(picture_path):
    os.makedirs(picture_path)

# Fetch wallpapers (last 4 days including today)
for idx in range(4):
    # Request Bing's wallpaper metadata
    api_url = f"https://www.bing.com/HPImageArchive.aspx?format=js&idx={idx}&n=1&mkt=en-US"
    response = requests.get(api_url, headers=headers)
    if response.status_code != 200:
        print(f"Failed to fetch data for idx={idx}, skipping.")
        continue

    data = response.json()
    if not data.get("images"):
        print(f"No images found for idx={idx}, skipping.")
        continue

    # Extract image details
    image_info = data["images"][0]
    image_url = "https://www.bing.com" + image_info["url"]
    image_name = image_info["urlbase"].split("/")[-1] + ".jpg"
    save_path = os.path.join(picture_path, image_name)

    # Download the image
    image_response = requests.get(image_url, headers=headers)
    if image_response.status_code == 200:
        with open(save_path, "wb") as f:
            f.write(image_response.content)
        print(f"Downloaded: {save_path}")
    else:
        print(f"Failed to download image for idx={idx}.")

Enter fullscreen mode Exit fullscreen mode

Online Test

python3 -c "$(curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/Excalibra/scripts/refs/heads/main/d-python/get_bing_wallpapers.py)"
Enter fullscreen mode Exit fullscreen mode

Reinvent your career. Join DEV.

It takes one minute and is worth it for your career.

Get started

Top comments (0)

👋 Kindness is contagious

Immerse yourself in a wealth of knowledge with this piece, supported by the inclusive DEV Community—every developer, no matter where they are in their journey, is invited to contribute to our collective wisdom.

A simple “thank you” goes a long way—express your gratitude below in the comments!

Gathering insights enriches our journey on DEV and fortifies our community ties. Did you find this article valuable? Taking a moment to thank the author can have a significant impact.

Okay