爬取必应首页背景作为桌面背景

目标

直接从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文件
(加注释是个好习惯,这样每个定时任务一看就知道是用来干嘛的)

结束

发表评论

电子邮件地址不会被公开。 必填项已用*标注