一键每日必应壁纸设置分析教程
本帖最后由 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自动退出了后台
大家用我发的脚本的时候,记得根据自己的实际情况改一下代码,使其更符合自己需求。
我用的源码:
snakeyuna 发表于 2024-5-16 14:53
todaybing下载的壁纸文件名www.todaybing.com.EcfIMAvK.jpg不是原本的文件名, OHR.ReconquistaVigo_ZH-C ...
我大概懂你的意思了,就是你点击下载的那个按钮的时候,他在下载那显示的不是照片原本的名字对吧,但我这个脚本是来设置壁纸的,跟它的名称没多大关系的,如果是在脚本上修改是可以修改为真实名的,只要获取到那个元素,然后提取相关的属性值,接着再处理属性值以获取真实名,然后用一个变量存储下来,等到保存路径的时候连接上这个变量就行了 hualy 发表于 2024-5-16 11:32
啥意思,不懂,我已经上传源码了,你可以下载下来看看
todaybing下载的壁纸文件名www.todaybing.com.EcfIMAvK.jpg不是原本的文件名, OHR.ReconquistaVigo_ZH-CN4619580424_UHD.jpg这个才是bing壁纸的真是命名 感谢分享 教程很详细,学习了。感谢分享。 感谢分享教程 用心讨论,共获提升! 这个牛掰了 能不能加个文件名以原始文件名命名? 挺好的小工具。可以当作爬虫入门示例。 snakeyuna 发表于 2024-5-16 08:58
能不能加个文件名以原始文件名命名?
啥意思,不懂,我已经上传源码了,你可以下载下来看看 学习下。
页:
[1]
2