写一个爬虫脚本获取必应(Bing)搜索引擎首页每日的4K超清壁纸 做文章封面

前言

每次写文章的封面不知道从哪里获取,每次都是去谷歌,百度搜索文章关键字 去找一些图,要么就是从代码运行结果找相关截图,总是找不到合适的文章图片显得乱糟糟的,又没有找到相关的项目能够根据关键字生成文章封面,今天就要到了一个另类的方法,用爬虫获取 必应(Bing)搜索引擎首页每日的高清大图。

开始

访问bing.com

很简单就能发现图片的请求地址隐藏到了网页里面

通过网页找图片的关键的方法是有水印的,而且图不是高清的

最后通过GitHub找到一个公开的接口: cn.bing.com/HPImageArch...

直接访问就能拿到高清无水印图片的地址文本内容,稍微做一下解析就行

接下来就简单写一下爬虫代码

python 复制代码
# 下载并存储Bing每日壁纸到指定位置


import os
import re
import requests
from io import BytesIO
from PIL import Image
import shutil

class BingUHD(object):

    def __init__(self):
        # 默认bing图片查询地址
        self.url = 'https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=ZH-CN'
        self.path = './BingUHD/'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/80.0.3987.132 Safari/537.36'
        }
        self.resolution = 'UHD'

    # 取得图片相关信息
    def get_img_info(self):
        try:
            # 获取图片信息
            result = requests.get(self.url, headers=self.headers).json()
            # 提取图片地址
            raw_img_url = 'https://cn.bing.com' + result['images'][0]['url']
            # 得到默认图片链接
            normal_img_url = raw_img_url[0:raw_img_url.find(".jpg") + 4]
            # 得到UHD图片链接替换默认的 1080 图片为UHD图片链接
            uhd_img_url = normal_img_url.replace("1920x1080", self.resolution)
            # 提取中文标题和版权信息
            date = result["images"][0]["startdate"]
            title = result["images"][0]["title"]
            copy_right = result["images"][0]["copyright"]

            return normal_img_url, uhd_img_url, date, title, copy_right

        except Exception as e:
            print('错误: 无法获取到图片地址,请检查网络连接' + '\n')

    def img_download(self,url,file_name):
        try:
            response = requests.get(url, stream=True)

            if response.status_code == 200:
                with open(file_name, 'wb') as f:
                    response.raw.decode_content = True
                    shutil.copyfileobj(response.raw, f)
                print(file_name+"图片下载成功")
            else:
                print(file_name+"无法下载图片")
        except Exception as e:
            print('错误: 无法下载图片,请检查网络连接' + '\n')

    # 得到今日图片信息并清洗
    def get_today_img_download(self,file_name):
        try:
            info = self.get_img_info()
            normal_url = info[0]
            uhd_url = info[1]

            

            # 图片分辨率文字
            # normal = normal_url[(normal_url.rfind("_") + 1): -4]
            # uhd = uhd_url[(uhd_url.rfind("_") + 1): -4]

            # 图片分辨率文字
            normal = self.get_pic_size()[0]
            uhd = self.get_pic_size()[1]
            self.img_download(normal_url,file_name+normal+'.jpg')
            self.img_download(uhd_url,file_name+uhd+'.jpg')
        except Exception as e:
            print('错误: 无法获取到图片信息,请检查网络连接' + '\n')


    # 取得文件名称
    def get_file_name(self):
        try:
            info = self.get_img_info()
            # 定义文件夹
            file_path = self.path + info[2][0:4] + '-' + info[2][4:6] + '/'
            # 判断文件夹是否存在
            if not os.path.exists(file_path):
                os.makedirs(file_path)
            # 定义文件名
            copy_right = info[4]
            copy_right = copy_right[0:copy_right.find(' ')]
            # 绝对路径
            name = info[2] + '.' + info[3] + '.' + copy_right + '.'
            full_name = file_path + name

            return full_name
        except Exception as e:
            print('错误: 无法获取到图片信息,请检查网络连接' + '\n')

    # 取得图片的尺寸
    def get_pic_size(self):
        """
        获取远程图片的尺寸
        :return:
        """
        size_list = []
        url = [self.get_img_info()[0], self.get_img_info()[1]]
        for u in url:
            r = requests.get(u)
            img = Image.open(BytesIO(r.content))
            pic_size = str(img.width) + 'x' + str(img.height)
            size_list.append(pic_size)
        return size_list

    # 取得今日美图文字
    def get_description(self):
        url = 'https://www.bing.com/?mkt=zh-CN'
        rsp = requests.get(url)
        result = re.search(r'({"Description":")(.*?)(","Image")', rsp.text).group(2)
        return result


if __name__ == "__main__":
    bing = BingUHD()
    file_name = bing.get_file_name()
    content = bing.get_today_img_download(file_name)

进入脚本根目录执行python脚本就能自动创建相关的文件夹,自动下载图片,项目结构内容如下:

最后

后面文章找不到封面我就拿这个做文章封面了,上面的代码通过已知隐藏的接口获取到了更高清图片的3140*2160 4K图片地址,看上图中的两种图片体积可以看出来,图片质量完全不一样。

可能对于Python 新手有些不友好,如果不抗拒一段段代码复制去询问ChatGPT 然后自己慢慢打印调试尝试,其实有那种精神就能慢慢学会了,站在技术实现的角度其实直接从F12控制台就能找到这个图片的源地址右键就能保存了,我的想法是后面有机会的话做一个图片展示的网站,尝试部署这个脚本用定时任务自动爬取收集这些图片,就不用特地手动运行脚本了。

相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
默_笙5 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
qq_426003965 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫5 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码5 天前
别再前后端各写一套表单校验了
java·后端
长沙三为智能科技5 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读5 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
大勇前进5 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端