使用crontab和python定时下载Bing首页美图

使用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自带的urllibre模块实现了对于页面的抓取分析和图片链接、名字(这里使用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 系统中 :

  1. 通过命令行形式指定解释器:python3 ./script.py,这种方式脚本中就可以不添加Shebang行;
  2. 通过脚本的Shebang来指定解释器:./script.py,这种方式就需要脚本的第一行如果写上#!/usr/bin/python3或者是#!/usr/bin/env python3shell会检查脚本的第一行代码, 发现有Shebang, 会按其指定的解释器来执行,在这里就是用python3解释器来执行;
  3. 命令行指定要比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.csdn.net/fangxuejiang/article/details/50082721
  • https://blog.csdn.net/legend818/article/details/89919682
发布了153 篇原创文章 · 获赞 72 · 访问量 11万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章