hualy 发表于 2024-5-15 16:15

一键每日必应壁纸设置分析教程

本帖最后由 hualy 于 2024-5-21 10:58 编辑

**思路学习**
今天看了论坛的一篇文章的源码,学习到了思路,感觉还是挺不错的
原文章:原创:每日必应壁纸爬取https://www.52pojie.cn/thread-1923222-1-1.html
源码:
```
import requests
from bs4 import BeautifulSoup
import sys
import os
from PIL import Image
from io import BytesIO

def debug(*value, sep=' ', end='\n', file=sys.stdout, flush=False):
    if sys.argv.split('.')[-1] == "exe":
      return
    print(*value, sep=sep, end=end, file=file, flush=flush)

url = "https://www.todaybing.com/"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}

response = requests.get(url, headers=headers)

if response.status_code == 200:
    debug("Success")
else:
    debug("Error")
    sys.exit()

soup = BeautifulSoup(response.text, "html.parser")
# debug(soup.prettify())
# use query selector to find the div with class "today-bing"

a = soup.select_one("i.text-sm.iconfont.icon-download.mr-4").parent

img_url = a["href"]
debug(img_url)

# download the image
response = requests.get(img_url, headers=headers)

if response.status_code == 200:
    Image.open(BytesIO(response.content)).convert('RGBA').save("bing.png")
    debug("Image saved")
else:
    debug("Error downloading image")
    sys.exit()

# set the wallpaper
import ctypes
SPI_SETDESKWALLPAPER = 20
ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, os.path.abspath("bing.png"), 3)

debug("Wallpaper set")
```

看了源码后,有了大概思路:打开网站--》找下载链接(下载链接在某个元素)--》保存,OK,明白后就想着自己来实现一下,然后来手把手教大家如何实现爬虫必应壁纸爬取
**1、打开网站**

这说明下载链接在这个元素
**2、找元素、找链接**
进入开发者模式,可以Ctrl+shift+i进入,也可以按F12,也可以在设置里找,如谷歌浏览器是右上角的三个小点-更多工具-开发者工具



点击元素的href的链接https://www.todaybing.com/download/sl?id=VgScvYbz&type=fhd&area=cn
会自动下载此壁纸,说明是此链接就是下载链接了

**3、写代码**
思路出来了,就是先请求https://www.todaybing.com/ 网站,然后再找到下载按钮元素,接着就是请求元素的链接,我是通过这个元素的类来找此元素的,这个元素是`class="text-white btn btn-sm btn-primary"`,通过ctrl + f 发现有且只有一个元素是这个类的,所以寻找的元素代码就如`:soup.find("a", {"class": "text-white btn btn-sm btn-primary"})`

都找到元素了,后面就请求链接就完了。
完整代码:
```
import requests
from bs4 import BeautifulSoup
import ctypes
from PIL import Image
from io import BytesIO
import time
import sys

# 定义一个结构体,用于设置窗口状态
class HWND(ctypes.Structure):
    _fields_ = [("handle", ctypes.c_void_p)]

# 获取当前窗口的句柄
handle = HWND(ctypes.windll.kernel32.GetConsoleWindow())

# 隐藏窗口
ctypes.windll.user32.ShowWindow(handle.handle, 0)

max_retries = 10
retry_count = 0
sleep_time = 60# 1分钟

while retry_count < max_retries:
    try:
      # 发送HTTP请求获取网页内容
      url = "https://www.todaybing.com/"
      response = requests.get(url)

      # 使用BeautifulSoup解析HTML内容
      soup = BeautifulSoup(response.text, "html.parser")

      # 找到下载链接的<a>标签
      download_link = soup.find("a", {"class": "text-white btn btn-sm btn-primary"})

      # 如果找到了元素,则提取链接属性
      if download_link:
            download_url = download_link.get("href")
            print("下载链接:", download_url)

            # 下载图片
            response = requests.get(download_url)
            if response.status_code == 200:
                # 将图片内容保存到内存中
                img = Image.open(BytesIO(response.content))

                # 定义保存地址为png格式
                save_path = "D:\\temp\\todaybing_wallpaper.png"
                img.save(save_path, "PNG")
                print("图片已保存为", save_path)

                # 设置为桌面背景
                SPI_SETDESKWALLPAPER = 20
                ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, save_path, 3)
                print("已将图片设置为桌面背景")

                # 如果代码成功执行,则跳出循环
                break

            else:
                print("无法下载图片")
      else:
            print("未找到相关的元素")

      retry_count += 1
      print(f"第 {retry_count} 次尝试失败,等待 {sleep_time} 秒后再尝试...")
      time.sleep(sleep_time)

    except Exception as e:
      print("出现错误:", e)
      retry_count += 1
      print(f"第 {retry_count} 次尝试失败,等待 {sleep_time} 秒后再尝试...")
      time.sleep(sleep_time)

# 关闭当前窗口
sys.exit()
```

代码中,为什么保存文件为png格式而不是如官网的jpg的呢?
谷歌搜索出来的答案:一般来说其实都是PNG更清晰,当然这是在相同品质的条件下。 JPG对于存储空间是比较小,但他牺牲了画质,压缩过了,而PNG的画质好,空间占得大。 借助图片格式转换器是可以进行转换的。
其实我还测试过了保存为jpg格式,空间是少了很多,但是dpi降低了,所以,我就用了png格式,更清晰一点吧
还有一点就是,我参考的那篇文章的代码是这样子的
`Image.open(BytesIO(response.content)).convert('RGBA').save("bing.png")`
详细区别如下:


**设置任务计划程序**
基本步骤如下:
1. 打开任务计划程序。
2. 在右侧操作面板中,选择“创建任务”。
3. 在“常规”选项卡中,为任务命名并选择“不管用户是否登录都要运行”。
4. 在“触发器”选项卡中,选择“新建”,然后选择“在用户登录时”。
5. 在“操作”选项卡中,选择“新建”,然后输入要运行的脚本的路径。
6. 确定保存任务。

**bat脚本**
我就不演示上面的了,为了方便就写个bat代码来自动化设置吧
```
@echo off
set python_path=C:\Python\python.exe# 修改为你的 Python 解释器路径(改后把#后的都删了)
set script_path=D:\path\to\your\python\script.py# 修改为你的 Python 脚本路径(改后把#后的都删了)

REM 添加到任务计划程序之系统启动触发器
schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc onstart /delay 0001:00
```

我是这样子设置的,大家可以根据自己的不同需求来进行填写
```
@echo off
set python_path=D:\biancheng\python\anaconda3\python.exe
set script_path=D:\temp\bizhiisbing.py

REM 添加到任务计划程序之系统启动触发器
schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc onstart /delay 0001:00
```

修改触发器如:
1. 一次性触发器:
`schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc once /st 08:00 /sd 2024-05-20`
2. 每周触发器:
`schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc weekly /d MON,TUE,WED /st 08:00`
3. 每月触发器:
`schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc monthly /d 15 /m 1 /st 08:00`
4. 用户登录触发器:
`schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc onlogon`
5. 系统启动触发器:
`schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc onstart`
这些命令会创建名为 "Bing Wallpaper Update" 的任务,并根据不同的触发器类型设置任务的执行时间。

运行后效果:

自己手动点运行可查看效果

看后台已经看见python在运行

代码执行完后,效果如下,并且python自动退出了后台


大家用我发的脚本的时候,记得根据自己的实际情况改一下代码,使其更符合自己需求。

我用的源码:



hualy 发表于 2024-5-16 19:11

snakeyuna 发表于 2024-5-16 14:53
todaybing下载的壁纸文件名www.todaybing.com.EcfIMAvK.jpg不是原本的文件名, OHR.ReconquistaVigo_ZH-C ...

我大概懂你的意思了,就是你点击下载的那个按钮的时候,他在下载那显示的不是照片原本的名字对吧,但我这个脚本是来设置壁纸的,跟它的名称没多大关系的,如果是在脚本上修改是可以修改为真实名的,只要获取到那个元素,然后提取相关的属性值,接着再处理属性值以获取真实名,然后用一个变量存储下来,等到保存路径的时候连接上这个变量就行了

snakeyuna 发表于 2024-5-16 14:53

hualy 发表于 2024-5-16 11:32
啥意思,不懂,我已经上传源码了,你可以下载下来看看

todaybing下载的壁纸文件名www.todaybing.com.EcfIMAvK.jpg不是原本的文件名, OHR.ReconquistaVigo_ZH-CN4619580424_UHD.jpg这个才是bing壁纸的真是命名

Dylan19970311 发表于 2024-5-15 16:32

感谢分享

雾都孤尔 发表于 2024-5-15 16:46

教程很详细,学习了。感谢分享。

leeyolo 发表于 2024-5-15 20:14

感谢分享教程

shanghui6666 发表于 2024-5-16 07:32

用心讨论,共获提升!

wobzhidao 发表于 2024-5-16 08:44

这个牛掰了

snakeyuna 发表于 2024-5-16 08:58

能不能加个文件名以原始文件名命名?

zixudaoxian 发表于 2024-5-16 09:20

挺好的小工具。可以当作爬虫入门示例。

hualy 发表于 2024-5-16 11:32

snakeyuna 发表于 2024-5-16 08:58
能不能加个文件名以原始文件名命名?

啥意思,不懂,我已经上传源码了,你可以下载下来看看

zd53011 发表于 2024-5-16 12:02

学习下。
页: [1] 2
查看完整版本: 一键每日必应壁纸设置分析教程