写在前面
每天面对着电脑,对着windows的世界之窗壁纸天天看,或者自定义的壁纸会一点审美疲劳,但每次更换壁纸感觉麻烦去找,所以自己就写了一套程序,每日自动获取微软Bing网页更新的壁纸,并替换当前桌面壁纸即可

配置环境与安装必要的库
环境
- python3.*
- nodejs PM2环境(非必须,仅用于任务自启动)
库文件
- requests(请求库)
- ctypes(调用系统命令库)
- time(设定定时任务)
- Json
- re
- sys
代码
获取网页图片并保存到本地
分析网页
首先要对微软Bing(https://cn.bing.com/)的网页进行分析,我们使用chrom调试分析出微软bing的壁纸地址


分析网页架构构建正则表达式
想要得到图片的完整地址还是需要从网页入手,我是基于re正则去构建,所以我分析了网页了组成结构,发现图片的源代码如下:

这里是可以跟域名拼接的,拼接可以直接得到这张图片源地址

接下来,就可以根据分析的规则构建正则表达式为:
1
| r='<link id=\"bgLink\" rel=\"preload\" href=\"(.*?)\" as=\"image\"'
|
完整的获取图片源地址代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| def get_url_img(): html=requests.get(json_data['url']) if html.status_code != 200: print('获取网页失败') return 0 r="<link id=\"bgLink\" rel=\"preload\" href=\"(.*?)\" as=\"image\"" img_url=re.findall(r,html.text)
if(len(img_url) == 0): print('没找找到符合的链接') return 0 img_link=json_data['url_source']+img_url[0]
return img_link
|

保存图片到本地
获取的源地址图片的link后,需要保存本地,那么则需要requests
库配合请求获取图片的二进制代码转存到本地,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def save_img(): img_link=get_url_img() if img_link == 0: return 0 content=requests.get(img_link).content path_img='c:\\1.jpg' try: with open(path_img,'wb') as f: f.write(content) return {'status':'success','path':path_img} except: return {'status':'error','path':''}
|
则图片成功保存到c:\\
目录下,成功获取到图片

调用系统命令更换壁纸
基于 ctypes
来调用系统的壁纸目录
此条命令是用来更换壁纸,img_path就是我们下载的图片地址
1
| ctypes.windll.user32.SystemParametersInfoW(20, 0, img_path, 0)
|
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| res=requestsImg.save_img()
if res['status'] == 'error': print('图片获取失败') else: img_path=res['path'] try: ctypes.windll.user32.SystemParametersInfoW(20, 0, img_path, 0) print('更换壁纸成功') except: print('无法调用系统API,请重试')
|
运行前后比较
运行前桌面的壁纸:

运行后桌面的壁纸:

定时任务
每天需要设定定时任务,让壁纸在一个固定时间切换,这里我写了这么一段代码来实现,每半小时更新一次
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| while(True): time_hms=time.strftime("%H", time.localtime()) if time_hms == json_data['time']: res=requestsImg.save_img() if res['status'] == 'error': print('图片获取失败') else: img_path=res['path'] try: ctypes.windll.user32.SystemParametersInfoW(20, 0, img_path, 0) print('更换壁纸成功') except: print('无法调用系统API,请重试') min=time.strftime("%H:%M:%S", time.localtime()) print('当前时间:'+min) time.sleep(1800)
|
并且我采用了pm2部署在windows上,并采取开启自动更新一次,就可以不断的在pc机中运行了,pm2的用法可以查询一下资料,非常简单,运行如下:

最后就完成了我们全自动定时更新壁纸的任务啦
完整代码
代码已上传到github
结尾
完善了一下代码,配置config文件,让其本身更具有拓展性,不一定局限于Bing网页,也可以去其他页面进行爬取图片,只要构建正常的re正则,就可以实现多页面图片爬取,原理都是一样的,当然,这只是简单的程序,我连请求头呀什么的都没有设置。以上,供参考交流。