目标
直接从Bing首页爬取壁纸到本地,然后使用shell命令进行壁纸更换
环境为:Ubuntu 16.04
实现过程
指定由python3执行
1#!/usr/bin/python3
指定编码为utf-8
1# -*- coding: utf-8 -*-
引入必要的库
1import requests #发起网页请求
2import re #使用正则表达式来匹配到图片网址
3import time #获取当前时间,用来文件命名
4import os #执行shell命令
可以先构建好文件名
1time = time.localtime() #获取当前时间
2filename = 'bing_%s_%s_%s.jpg' % (time.tm_year, time.tm_mon, time.tm_mday) #用时间构建好文件名
爬取Bing首页
1url = 'https://cn.bing.com' #国内Bing网址
2headers = {'user-agent': 'Mozilla/5.0'} #伪装成浏览器,降低访问失败的概率
3r = requests.get(url, headers=headers) #get到网页
从网页源码中解析出首页背景图片的url
1imgurl = url + '/' + re.search(r'url: ".*.jpg"', r.text).group()[6:-1]
re.search(r'url: ".*.jpg"', r.text)
中:
r.text
是网页的源码(r只是requests中get请求返回来的一个对象,该对象的text属性才是源码)r'url: ".*.jpg"'
是正则表达式,将会匹配到 以 url: "
开头,以 .jpg"
结尾,中间是若干个任意字符 的字符串re.search
方法如果匹配到结果,将会返回一个含有目标字符串的对象,通过 group()
方法得到匹配到的字符串
对于其后的 .group()[6:-1]
部分:
我只需要字符串中的url部分,所以对字符串做一个切片操作,取第 6
到第 -2
个字符
此时截取的url是不完整的,所以要在前面加入 url
变量里面存储的Bing首页的网址进行补全。
- 图片网址拿到了,那接下来就是访问然后保存到文件了
1img = requests.get(imgurl) #get到图片所在的网页内容
2with open('/home/ubuntu/Wallpapers/%s'%filename, 'wb') as fp:
3 fp.write(img.content)
with ... as ...
是推荐的打开文件的格式wb
以二进制+写形式打开文件,文件不存在会自动新建fp
是文件的句柄fp.write
是以二进制写入img.content
是网页内容的二进制形式,图片、音频的文件流都是要用二进制形式的
执行shell命令更换壁纸
1 #在执行反斜杠后的更换壁纸的命令之前,要先执行反斜杠前的那两条shell命令,不然壁纸换不成。这我在上篇博文提到过。
2os.system("PID=$(pgrep gnome-session);export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-);\
3gsettings set org.gnome.desktop.background picture-uri 'file:///home/ubuntu/Wallpapers/%s' &>> /home/ubuntu/autoUpateWallpapers.log" % filename)
其中,所有输出都会重定向到 autoUpdateWallpapers.log
中
1os.system("echo '%s.%s.%s %s:%s:%s更换了一次壁纸' >> /home/ubuntu/autoUpateWallpapers.log" % (time.tm_year, time.tm_mon, time.tm_mday, time.tm_hour, time.tm_min, time.tm_sec))
执行完代码,写一条记录进到log文件中
最后,可以加个if…else把爬取首页的包裹一下
1if r.status_code == 200:
2 imgurl = url + '/' + re.search(r'url: ".*.jpg"', r.text).group()[6:-1]
3 img = requests.get(imgurl)
4 with open('/home/ubuntu/Wallpapers/%s'%filename, 'wb') as fp:
5 fp.write(img.content)
6 os.system("PID=$(pgrep gnome-session);export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-);\
7gsettings set org.gnome.desktop.background picture-uri 'file:///home/ubuntu/Wallpapers/%s' &>> /home/ubuntu/autoUpateWallpapers.log" % filename)
8 os.system("echo '%s.%s.%s %s:%s:%s更换了一次壁纸' >> /home/ubuntu/autoUpateWallpapers.log" % (time.tm_year, time.tm_mon, time.tm_mday, time.tm_hour, time.tm_min, time.tm_sec))
9else: #没正常获取到Bing首页,那其他操作自然不要做了,输出一段信息就好了。当然这段信息也是会被重定向到log文件的,这会在设置定时任务的时候设置
10 print('OpenURLError.')
最最后,给文件赋予执行权限,加入到当前用户的定时任务里
1chmod 755 ./autoUpdateWallpapers.py
给程序赋予执行权限后就不需要敲python3加文件名来执行程序了
1mv ./autoUpdateWallpapers.py ~/bin/autoUpdateWallpapers
这里相当于两步操作:去掉后缀(重命名文件),这样看着舒服些
把程序移动到
home
目录下的bin
文件夹内。没有这个文件夹?那就建一个。
插几句闲话
建这个目录并把自己写的程序放到这个目录里是很方便的。因为系统已经预留了这个目录的位置,并且默认把它放到了环境变量里面,即使你还没有建这个文件夹。
打开
~/.profile
文件看看即可满足好奇心。该文件末尾会有下面两行
1set PATH so it includes user's private bin directories
2PATH="$HOME/bin:$HOME/.local/bin:$PATH"
可见
$HOME/bin
目录已经被预留出来了
回到主线
终端执行
1crontab -e #在当前用户身份下执行这个命令
这将打开当前用户的定时任务配置文件
– 在文件末尾加入下面这行
1#每日自动更换壁纸
20 23 * * * /home/ubuntu/bin/autoUpdateWallpapers &>> /home/ubuntu/autoUpateWallpapers.log
0
过零分钟(整点)23
晚上十一点* * *
依次代表 日 月 星期,详细请 查找 crontab 相关内容
接下来跟的就是命令了,&>>
所有输出重定向到log文件
(加注释是个好习惯,这样每个定时任务一看就知道是用来干嘛的)