環境:vps,centos7,python3.8.10,青龍面板(用寶塔安裝)
任務:用python代碼,監控一個網站頁面是否有更新(新帖子),若有,則提醒(發布到wordpress或者發送到微信)。
備注:本程序檢測更新情況,沒有用到數據庫。而是采用列表對比的方法,即上次的情況存到列表pre_list中,一分鐘后,將本次的情況存到列表now_list中,然后對比兩個列表,如果now_list中有,但pre_list無,即表示有了新帖子。
所以,在檢測程序A.py中,使用了while無限循環。
在實際運行中,出現了一個問題,就是長時間運行后,程序會報錯[Errno 101] Network unreachable'),我猜測是長時間高頻率訪問網站,被網站強制斷網了(但還不是反爬非常嚴重,過一會再運行就又能成功了)。
于是,我設計這樣一個思路。
編寫一個程序B.py,使用青龍半小時運行一次B.py,B.py的作用是用于查看程序A.py是否處于運行中,如果A.py在運行,就什么都不做,如果A.py終止了,則啟動A.py。
下面分別來實現A.py和B.py。
#A.py,循環檢測網頁是否有更新(新帖子)import requests
from bs4 import BeautifulSoup
import time
from lxml import etree
#from wordpress_xmlrpc import Client, WordPressPost
#from wordpress_xmlrpc.methods.posts import NewPost
import datetime
import jsondef pushplus_notify(title,content):print('將消息發送至WX')#略def Get_Content(url):print('得到新帖子的內容')#略proxies = {'http': "socks5://127.0.0.1:10808",'https': "socks5://127.0.0.1:10808"}headers={#略
}pre_list=[]
url='https://xxx.com'
r=requests.get(url,headers=headers,proxies=proxies)
bs = BeautifulSoup(r.text, 'html.parser')
id_nodes=bs.find_all('a',attrs={"class":'xxx'})
for id_node in id_nodes:pre_list.append(id_node.get('href'))#初始化pre_listprev_time = time.time()
while True:curr_time = time.time()if curr_time - prev_time >= 60:url='https://xxx.com'r=requests.get(url,headers=headers,proxies=proxies)bs = BeautifulSoup(r.text, 'html.parser')id_nodes=bs.find_all('a',attrs={"class":'xxx'})now_list=[]for id_node in id_nodes:now_list.append(id_node.get('href'))new_elements=[x for x in now_list if x not in pre_list]#now_list(一般用于存放本次新數據)中有、但pre_list(一般用于存放上次數據<舊數據>)中沒有的元素if len(new_elements)>0:print('有新貼了,'+str(new_elements))pre_list=now_listprev_time = curr_time#獲取新帖內容(為了演示方便,我只取新帖子們的第一個帖子[因為有可能有多個新帖])good_content=Get_Content(new_elements[0])good_content=good_content.replace('\\','')now = datetime.datetime.now()title = now.strftime("%Y-%m-%d_%H-%M-%S")pushplus_notify(title,good_content)time.sleep(2)time.sleep(2)
下面是使用青龍每半小時運行、檢測A.py程序是否還在正常運行的B.py。
import psutil
import subprocessdef check_process(process_name):for proc in psutil.process_iter(['pid', 'name', 'cmdline']):if proc.info['name'] == 'python3' and len(proc.info['cmdline']) > 1 and proc.info['cmdline'][1] == process_name:return Truereturn Falsedef start_process(script_path):subprocess.Popen(['python3', script_path])# 指定要檢測的腳本名
script_name = "A.py" # 替換為實際腳本名稱
script_path = "A.py" # 替換為實際腳本路徑# 檢測進程是否在運行
if check_process(script_name):print(f"進程 {script_name} 正在運行.")
else:print(f"進程 {script_name} 沒有在運行,正在啟動...")start_process(script_path)print(f"進程 {script_name} 已啟動.")
說明:
(1)可以使用ps -ef | grep python3觀察A.py是否正在運行
參考我的文章:
記錄centos中操作(查找、結束、批量)進程以及crontab定時寫法的知識-CSDN博客
(2)每個半小時運行的crontab寫法
(3)不要忘記在青龍的“依賴管理”中添加相應的庫
(4)通過青龍將A.py和B.py放入VPS中,無需使用FileZilla Client。