当前位置: 首页 > news >正文

通过BingAPI爬取Bing半个月内壁纸

通过BingAPI爬取Bing半个月内壁纸

  • 一、前言
  • 二、爬虫代码
  • 三、代码说明

一、前言

爬取Bing搜索网站首页壁纸的方式主要有两种,第一种为间接爬取,即并不直接对Bing网站发起请求,而是对那些收集汇总了Bing壁纸的网站发起请求,爬取图片。第二种为直接爬取,即直接对Bing网站发起访问。

本文使用第二种,通过Bing官方提供的一种API进行壁纸下载,通过这种方式可以下载从下载当天起半个月内Bing搜索网站首页使用过的壁纸。
在这里插入图片描述

二、爬虫代码

import json
import requests
import os
import re
import time
from colorama import Fore, Back, Style
import colorama

colorama.init(autoreset = True)

def download_imgWallpaper_of_bing(headers, save_folder_path = None):
    """下载必应从昨天起前15天的壁纸图片"""
    print(Fore.GREEN + Style.BRIGHT + '\n' + '-' * 30 + 'Bing必应 壁纸图片' + '-' * 30 + '\n')
    
    if save_folder_path is None:
        save_folder_path = 'bing壁纸图片'
    if not os.path.exists(save_folder_path):
        os.mkdir(save_folder_path)
    
    exist_imgs = os.listdir(save_folder_path)
    url01 = 'http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=7'
    url02 = 'http://cn.bing.com/HPImageArchive.aspx?format=js&idx=8&n=8'
    imgs_data = []
    
    try:
        for url in [url01, url02]:
            print(Fore.BLUE + Style.BRIGHT + '\n正在下载html文件,地址如下:')
            print(url)
            res = requests.get(url, headers = headers, timeout = (5, 5))
            res.raise_for_status()
            
            if len(res.content) < 10:
                continue
            
            data = json.loads(res.content)
            imgs_data.extend(data['images'])
    except Exception as e:
        print(Fore.RED + Back.WHITE + "\n下载html文件失败,详情如下:")
        print(e)
        return

    img_url_count = len(imgs_data)
    if img_url_count == 0:
        print(Fore.RED + Back.WHITE + "\n从html文件中提取到的壁纸图片Url数量为零")
        return
    
    img_num = 0
    for img_data in imgs_data:
        try:
            img_name = img_data['startdate'] + '_' + img_data['copyright'] + '.jpg'
            img_name = re.sub(r'[<>:"/\\|?*]', '_', img_name)
            if img_name in exist_imgs:
                continue
            
            img_path = save_folder_path + '/' + img_name
            img_url = 'http://cn.bing.com' + img_data['url']
            print(Fore.BLUE + Style.BRIGHT + "\n正在下载第%s/%s张图片,地址如下:" % (img_num + 1, img_url_count))
            print(img_url)
            res = requests.get(img_url, headers = headers, timeout = (5, 10))
            res.raise_for_status()
            
            with open('%s' % img_path,'wb') as f:
                f.write(res.content)
            
            print(Fore.BLUE + Style.BRIGHT + "完成下载")
            img_num += 1
            time.sleep(1)
        except Exception as e:
            print(Fore.RED + Back.WHITE + "\n下载异常,详情如下:")
            print(e)
            continue
    
    if img_num == img_url_count:
        print(Fore.YELLOW + Style.BRIGHT + "\n所有壁纸图片下载完成,保存文件夹为:" + os.path.abspath(save_folder_path))
    else:
        print(Fore.YELLOW + Style.BRIGHT + "\n壁纸图片已下载%s,未下载%s张,保存文件夹为%s" % (img_num, img_url_count - img_num, os.path.abspath(save_folder_path)))

if __name__ == '__main__':
    
    headers={}
    headers["Accept"]="*/*"
    headers["Accept-Encoding"]="gzip, deflate, br, zstd"
    headers["Accept-Language"]="zh-CN,zh;q=0.9"
    headers["Connection"]="keep-alive"
    headers["Cache-Control"]="max-age=0"
    headers["Upgrade-Insecure-Requests"]="1"
    headers["User-Agent"]="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
    
    download_imgWallpaper_of_bing(headers)

三、代码说明

给出的代码为python代码,代码会下载从下载当天起15天内Bing网站使用的壁纸。

  1. 下载图片是以Bing的使用日期+图片说明命名,由于时差的原因当天使用的壁纸日期会是前一天的日期;
  2. 如果不指定保存文件夹,则会在当前运行目录自动创建“bing壁纸图片”文件夹,将下载图片保存在其中;
  3. 下载图片前会根据文件名对保存文件夹进行检查,防止重复下载壁纸
  4. 程序运行过程中会给出不同颜色的提示信息,如下图所示:
    在这里插入图片描述

相关文章:

  • 基于Unity引擎的网络通信架构深度解析——以NetworkConnectionController为例
  • pdf-extract-kit paddle paddleocr pdf2markdown.py(效果不佳)
  • Spring Boot项目开发常见问题及解决方案(上)
  • Java数据结构——Map和Set
  • 【C++项目】Rpc通信框架设计
  • Dest1ny漏洞库: 美团代付微信小程序系统任意文件读取漏洞
  • Linux相关概念和易错知识点(28)(线程控制、Linux下线程的底层)
  • unity学习46:反向动力学IK
  • 《Operating System Concepts》阅读笔记:p17-p25
  • 碰一碰发视频@技术原理与实现开发步骤
  • PaddlePaddle的OCR模型转onnx-转rknn模型_笔记4
  • 字节跳动AI编辑器Trae基本配置教程
  • Web安全|渗透测试|网络安全
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_alloc函数
  • SpringCloud系列教程:微服务的未来(二十四)Direct交换机、Topic交换机、声明队列交换机
  • 单片机常见bug记录(长期更新)
  • 【含文档+PPT+源码】基于SpringBoot+Vue的个性化健身助手系统
  • 商淘云连锁企业管理系统如何实现多门店统一管理
  • 机器学习_19 集成学习知识点总结
  • 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
  • 云南陆良县发生一起装载机致人伤亡事件,造成6死4伤
  • 直击谷歌I/O 2025:谷歌AI眼镜剑指主流市场,未来拍电影全靠“打字”?
  • 福州市委副书记、福州新区党工委书记陈云水转任三明市政协党组书记
  • “除非我去世”,马斯克称仍致力于继续执掌特斯拉
  • 【社论】鸿蒙破壁,向最难处攻坚
  • 英国研究:近七成年轻人认为上网有害心理健康