用Python爬虫+Crontab实现自动更换电脑壁纸

概要

系统:DeepinOS15.8桌面版

编程语言&工具:Python3.5,requests,crontab

最近换壁纸的时候,纠结不知道换什么壁纸好。刚好前段时间从小伙伴那里了解到了Linux的定时任务机制crontab,很早之前就想写个自动爬虫了,每天给我爬爬有趣的东西(手动滑稽)。

这次总体思路是:

1.从网络上爬取高清壁纸到本地文件夹

2.找到DeepinOS更换壁纸的命令

3.设置定时任务(我设置的是每30分钟从网上爬取图片,每2分钟换一次壁纸,可以根据个人喜好设置。)

一、爬取壁纸

我爬取的是必应壁纸(https://bing.ioliu.cn/),必应壁纸的反爬措施还是有的,你用Chrome打开必应壁纸你会发现你在这个网站不能打开Chrome的开发者模式,然后你用在Chrome里的headers必应会直接抛给你403。不过由于最近在做计算机网络的实验,我想到了WireShark这个抓包神器哈哈哈,直接在Chrome里下载一张壁纸,然后抓包追踪htttp流找到必应壁纸的文件服务器和相关的headers。还有必应壁纸html里有相关的壁纸的下载链接(结尾是force=download),你以为它直接给你,其实是个坑,你会发现这个链接在Chrome里是可以下载壁纸的,然后你用Python代码Requests.get的时候发现根本不是图片。感觉那个链接是实现某种跳转的(防盗链?)WireShark真好用。由于是高清壁纸,下载的时候可能会有些慢,还有之所以没用aiohttp是因为目前还在学。。。不是很熟练,最近学Python异步IO真的学的有点混乱。

爬虫代码不是很难关键的我会在注释里标注,代码如下:

import requests
import re
import random
import stringUtils.generate_headers as ge#这是我自己写的一个生成headers的包,前一篇博客就是

BASE_PAGE_URL = 'https://bing.ioliu.cn/ranking?p='#这是必应壁纸的排行榜网址,p就是第几页p=1是第一页
MAX_PAGE = 84 #一共有84页
BASE_PIC_URL = 'http://h1.ioliu.cn/bing/'#图片服务器
PATH = '/home/alexhowe/Pictures/WallPapers/'#本地地址
RE_PATTERN = re.compile('

二、用Python执行换壁纸命令

这里真是有坑,本来以为很简单,结果一遇到crontab真是巨无比坑。本来以为只需要导入os包用os.system(cmd)去执行换壁纸命令就好了,我还是太年轻了。结果放到crontab里,根本没有换壁纸。试了无数遍,各种百度不行,然后Google才有点头绪,这涉及了Linux进程之间的通信,想具体了解的看这里:https://chubuntu.com/questions/37132/editing-gsettings-unsuccesful-when-initiated-from-cron.html非常感谢问题和回答,不然我是真的不知道该怎么办了。期间在stackoverflow看到,有人也跟我想的一样,写个自动换壁纸的脚本,试了很多次他放弃了。。。。然后我在那里没找到答案。

代码如下:

import os
import random
import subprocess
CMD = 'gsettings set com.deepin.wrap.gnome.desktop.background picture-uri /home/alexhowe/Pictures/WallPapers/' #这个是Deepin换壁纸的命令picture-uri后加上壁纸路径就行了


def chage():
    index = random.randint(0,11)#这里我还是随机的从本地选一张
    pid = subprocess.check_output(["pgrep", "dde-session"]).decode("utf-8").strip()#获取到dde-session的PID具体请看上面的那个问题与回答
    cmd = "grep -z DBUS_SESSION_BUS_ADDRESS /proc/" + pid + "/environ|cut -d= -f2-"
    os.environ["DBUS_SESSION_BUS_ADDRESS"] = subprocess.check_output(
        ['/bin/bash', '-c', cmd]).decode("utf-8").strip().replace("\0", "")
    os.system(CMD+str(index)+'.jpg')
    print('OK')



if __name__ == '__main__':
    chage()

看了这个以后,就觉得我对Linux的了解还是太少了。这里的dde-sssion是关键,要是别的Linux发行版,你要找到你的桌面环境对应的session,据我所指Ubuntu Gnome桌面环境这里就可以换成gnome-session。一开始我用的是gnome-session发现没用,查了一下才知道Deepin的桌面环境是dde。

三、设置定时任务

众所周知Linux设置定时任务使用的是crontab,crontab的具体用法就不说了,想了解可以百度。我只说这次用到的吧,我所知道的设置crontab任务的方法有两种:编辑/etc/crontab和使用crontab -e命令再用service cron reload。

第一种方法可以指定这个crontab的用户,然后编辑完保存后系统自动加载crontab任务,

第二种是在当前登录的用户的crontab,需要手动输入service cron reload 加载这个crontab任务

我用的是第二种。

*/2 * * * * /usr/bin/python3.5 /home/alexhowe/PycharmProjects/backgrounds/change_wallpaper.py
*/30 * * * * /usr/bin/python3.5 /home/alexhowe/PycharmProjects/backgrounds/main.py

第一行是每两分钟执行后面的命令,就是把随机换壁纸的py程序执行一遍,第二行是每30分钟从必应壁纸随机选一页爬取图片。

想要删除crontab任务可以使用crontab -r

最后感谢各位在互联网分享自己所学的人。

你可能感兴趣的:(Deepin使用日记,Python日记)