使用crontab
定时下载Bing首页美图
前言
个人比较喜欢Bing首页的图片,想收集下,下载简单,但是每天都去手动下就有点麻烦了。这里简单介绍下使用linux上的crontab
设置定时任务来驱动python
下载图片。
正文
首先需要一个脚本文件,需要已经实现了对应的功能。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@author: lart
"""
import os
import urllib
import urllib.request
import re, socket, time
def r_o_html(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0'}
request = urllib.request.Request(url, headers=headers)
NET_STATUS = False
while not NET_STATUS:
try:
response = urllib.request.urlopen(request, data=None, timeout=3)
html = response.read().decode('UTF-8')
return html
except socket.timeout:
NET_STATUS = False
def re_findall(re_string, html):
pattern = re.compile(re_string, re.I)
result = pattern.findall(html)
return result
if __name__ == '__main__':
url_base = 'https://cn.bing.com/'
html = r_o_html(url_base)
find_pic = re_findall(r'<link id="bgLink".+?href="(.+?).jpg', html)
down_link = url_base + find_pic[0] + '.jpg'
# 不能使用该id标签下的所有文字,因为`/`字符不允许存在于linux的文件名字中
find_name = re_findall(r'<a id="sh_cp".+?title="(.+?) \(', html)
bing_img = urllib.request.urlopen(down_link).read()
# 图片保存路径
local = os.path.join('/home/lart/Pictures/Bing', find_name[0] + ".jpg")
with open(local, 'wb') as code:
code.write(bing_img)
这里使用python自带的urllib
和re
模块实现了对于页面的抓取分析和图片链接、名字(这里使用Bing的关于改图的简介)的提取。
接下来开始准备使用crontab
来执行指令。所以我们需要现有一条指令,必须的是可执行的。上面的代码使用python3
写的,但是系统安装的是2.7,miniconda3
的环境只在启动base
或者自己的新环境的时候有效,所以最好的方式还是使用Shebang
来直接指定环境。也就是上面开头的#!/usr/bin/env python3
字段。
关于Shebang
,在文章浅谈#!/usr/bin/python3 和 #!/usr/bin/env python3中进行了详细介绍,这里贴几段:
在Python脚本的第一行,常常能看到
#!/usr/bin/env python3
或者#!/usr/bin/python3
字样,其中#!
符号在计算机行业中叫做 “Shebang”, 其作用是指定由哪个解释器来执行脚本。在这里即是指定python3作为解释器。windows系统是根据文件后缀决定打开方式的,因此首行Shebang是没有用的,只有类unix系统才是根据文件头决定脚本运行方式。
在 类Unix 系统中 :
- 通过命令行形式指定解释器:
python3 ./script.py
,这种方式脚本中就可以不添加Shebang
行;- 通过脚本的
Shebang
来指定解释器:./script.py
,这种方式就需要脚本的第一行如果写上#!/usr/bin/python3
或者是#!/usr/bin/env python3
,shell
会检查脚本的第一行代码, 发现有Shebang
, 会按其指定的解释器来执行,在这里就是用python3
解释器来执行;- 命令行指定要比
Shebang
指定优先级更高:当脚本里写上#!/usr/bin/python3
或者是#!/usr/bin/env python3
,但是在命令行输入python2 ./script.py
,最终是以python2
解释器来执行。注意两点:
#!
之后的空格是可选的,#!/usr/bin/env python3
和#! /usr/bin/env python3
这两种写法都可以;- 通过命令行指定解释器执行文件是不必写
Shebang
的, 只有被直接执行的文件才有必要加入Shebang
。
#!/usr/bin/python3
采用了绝对路径的写法,即指定了采用/usr/bin/python3
该路径下的解释器来执行脚本。如果python3
解释器不在该路径下的话(用anaconda
安装的话有可能不在),./script.py
就无法运行。而#!/usr/bin/env python3
的写法指定从PATH
环境变量中查找Python解释器的位置,因此只要环境变量中存在,该脚本即可执行。所以一般情况下采用#!/usr/bin/env python3
的写法更好,容错率更高。
但是单纯设置了Shebang
,我们还不够,还需要考虑执行的问题。单独新建的文件是没有执行的权限的。可以通过使用chmod +x filename.py
来添加执行权限。
$ vim test.py
$ cat test.py
#! /usr/bin/env python3
# -*- coding=utf8 -*-
"""
# @Author : lart
# @Created Time : 2019-11-05 15:36:48
# @Description : Test Shabang and Permission.
"""
print("Hello, I'm Lart.")
$ ./test.py
bash: ./test.py: Permission denied
$ ll
total 12
drwxr-xr-x 2 lart lart 4096 11月 5 15:41 ./
drwxrwxr-x 5 lart lart 4096 11月 5 15:36 ../
-rw-r--r-- 1 lart lart 182 11月 5 15:41 test.py
$ chmod +x test.py
$ ll
total 12
drwxr-xr-x 2 lart lart 4096 11月 5 15:41 ./
drwxrwxr-x 5 lart lart 4096 11月 5 15:36 ../
-rwxr-xr-x 1 lart lart 182 11月 5 15:41 test.py*
$ ./test.py
Hello, I'm Lart.
现在已经可以使用./filename.py
的形式执行脚本了。之后便是crontab
的使用了,网上关于它的教程有很多,我简单整理了下,放到了这里:https://github.com/lartpang/LinuxNote/issues/31。
使用crontab -e
编辑自己的任务即可。
参考链接
- https://blog.youkuaiyun.com/fangxuejiang/article/details/50082721
- https://blog.youkuaiyun.com/legend818/article/details/89919682