思路学习
今天看了论坛的一篇文章的源码,学习到了思路,感觉还是挺不错的
原文章:原创:每日必应壁纸爬取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
点击元素的href的链接https://www.todaybing.com/download/sl?id=VgScvYbz&type=fhd&area=cn
会自动下载此壁纸,说明是此链接就是下载链接了
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
都找到元素了,后面就请求链接就完了。
完整代码:
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
设置任务计划程序
基本步骤如下:
- 打开任务计划程序。
- 在右侧操作面板中,选择“创建任务”。
- 在“常规”选项卡中,为任务命名并选择“不管用户是否登录都要运行”。
- 在“触发器”选项卡中,选择“新建”,然后选择“在用户登录时”。
- 在“操作”选项卡中,选择“新建”,然后输入要运行的脚本的路径。
- 确定保存任务。
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
修改触发器如:
- 一次性触发器:
schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc once /st 08:00 /sd 2024-05-20
- 每周触发器:
schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc weekly /d MON,TUE,WED /st 08:00
- 每月触发器:
schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc monthly /d 15 /m 1 /st 08:00
- 用户登录触发器:
schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc onlogon
- 系统启动触发器:
schtasks /create /tn "Bing Wallpaper Update" /tr "%python_path% %script_path%" /sc onstart
这些命令会创建名为 "Bing Wallpaper Update" 的任务,并根据不同的触发器类型设置任务的执行时间。
运行后效果:
6
自己手动点运行可查看效果
7
看后台已经看见python在运行
8
代码执行完后,效果如下,并且python自动退出了后台
大家用我发的脚本的时候,记得根据自己的实际情况改一下代码,使其更符合自己需求。