使用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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章