我写了一个迷你应用程序,它会抓取我学校的网站,然后查找上一篇文章的标题,将其与旧标题进行比较,如果不一样,它就会向我发送一封电子邮件。 为了使应用程序正常工作,它需要保持 24/7 持续运行,以便标题变量的值正确。 这是代码:
import requests
from bs4 import BeautifulSoup
import schedule, time
import sys
import smtplib
#Mailing Info
from_addr = ''
to_addrs = ['']
message = """From: sender
To: receiver
Subject: New Post
A new post has been published
visit the website to view it:
"""
def send_mail(msg):
try:
s = smtplib.SMTP('localhost')
s.login('email',
'password')
s.sendmail(from_addr, to_addrs, msg)
s.quit()
except smtplib.SMTPException as e:
print(e)
#Scraping
URL = ''
title = 'Hello World'
def check():
global title
global message
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')
main_section = soup.find('section', id='spacious_featured_posts_widget-2')
first_div = main_section.find('div', class_='tg-one-half')
current_title = first_div.find('h2', class_='entry-title').find('a')['title']
if current_title != title:
send_mail(message)
title = current_title
else:
send_mail("Nothing New")
schedule.every(6).hours.do(check)
while True:
schedule.run_pending()
time.sleep(0.000001)
所以我的问题是如何使用 Cpanel 保持此代码在主机上运行? 我知道我可以使用 cron 作业每隔 2 小时运行一次,但我不知道如何保持脚本本身运行,当我关闭页面时使用终端不起作用,应用程序被终止
因此,通常要长时间运行程序,需要对它们进行守护进程。本质上是通过双叉和 set-sid 与终端断开连接。话虽如此,我自己实际上从未这样做过,因为它通常要么(a)错误的解决方案,要么(b)它重新发明轮子(https://github.com/thesharp/daemonize) .
在这种情况下,我认为更好的做法是每 6 小时调用一次脚本,而不是让它在内部每 6 小时执行一些操作。让您的程序能够适应重新启动几乎是大多数系统保持可靠性的方式,并将它们放入自动重新启动的“摇篮”中。
就您而言,我建议将标题保存到文件中,并在调用脚本时读取和写入该文件。它将使您的脚本更简单、更健壮,并且您将使用久经考验的工具来完成这项工作。
几年后,当您编写的代码需要在整个机器崩溃后幸存下来并被替换(在 6 小时内,所有东西都已安装)时,您可以使用某种外部形式的存储(例如数据库)来代替文件,使您的系统更具弹性。