使用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.csdn.net/fangxuejiang/article/details/50082721
- https://blog.csdn.net/legend818/article/details/89919682