吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1563|回复: 15
收起左侧

[其他原创] 一键每日必应壁纸设置分析教程

  [复制链接]
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[0].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,也可以在设置里找,如谷歌浏览器是右上角的三个小点-更多工具-开发者工具

1

1

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

3

3
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"})

4

4

都找到元素了,后面就请求链接就完了。
完整代码:

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")
详细区别如下:

5

5

设置任务计划程序
基本步骤如下:

  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" 的任务,并根据不同的触发器类型设置任务的执行时间。

运行后效果:

6

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

7

7

看后台已经看见python在运行

8

8

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

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



我用的源码: 源码.zip (1.59 KB, 下载次数: 1)



2

2

免费评分

参与人数 8威望 +1 吾爱币 +16 热心值 +8 收起 理由
苏紫方璇 + 1 + 10 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
丶江流儿 + 1 + 1 谢谢@Thanks!
top777 + 1 + 1 谢谢@Thanks!
songshanyuwu + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wanfon + 1 + 1 热心回复!
FitContent + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
P_rometheus + 1 + 1 谢谢@Thanks!
sishuiliunian1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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
学习下。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 08:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表