利用Python自动监控网站并发送邮件告警的方法

  • Post category:Python

这里提供一种利用Python自动监控网站并发送邮件告警的方法,首先需要安装以下模块:

pip install requests
pip install beautifulsoup4
pip install schedule
pip install smtplib

Step 1: 导入模块

import requests
from bs4 import BeautifulSoup
import schedule
import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

Step2: 编写函数,用于获取需要监控的网站内容

def get_website_content():
    try:
        url = 'http://www.example.com'
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
        response = requests.get(url=url, headers=headers)
        soup = BeautifulSoup(response.text, 'html.parser')

        # 这里可以根据需要提取网站中的内容
        # 以下代码只是示例,提取网站标题
        title = soup.title.string.strip()
        return title
    except Exception as e:
        print(e)

Step 3: 编写函数,用于发送告警邮件

def send_email():
    try:
        # 邮件配置
        sender = 'sender@example.com'
        receiver = ['receiver@example.com']  # 这里可以传入多个收件人,以列表形式传入
        mail_host = 'smtp.example.com'  # SMPT服务器地址
        mail_port = 25  # 端口号
        username = 'sender@example.com'  # 发件人邮箱
        password = 'password'  # 邮箱密码
        subject = 'Website Monitor Alert'  # 邮件主题
        content = 'Website is down!'  # 邮件内容

        # 构造邮件
        message = MIMEMultipart()
        text_content = MIMEText(content, 'plain', 'utf-8')
        message['Subject'] = subject
        message.attach(text_content)

        # 发送邮件
        smtp = smtplib.SMTP(host=mail_host, port=mail_port)
        smtp.login(username, password)
        smtp.sendmail(sender, receiver, message.as_string())
        smtp.quit()
        print('Email Alert Sent!')
    except Exception as e:
        print(e)

Step 4: 编写定时器任务,监控网站并触发告警

def monitor_website():
    website_title = get_website_content()
    if website_title is None or len(website_title) == 0:
        send_email()

# 每5分钟监控一次,可以根据需要进行调整
schedule.every(5).minutes.do(monitor_website)

while True:
    schedule.run_pending()
    time.sleep(1)

以上就是一个利用Python自动监控网站并发送邮件告警的简单攻略了。以下是两个实际的示例:

示例1: 监控某在线商城的商品是否有货

假设某在线商城上有一款热门商品常常缺货,我们可以通过监控商品详情页上的“库存”信息来判断商品是否有货,当网站更新库存信息时,触发告警邮件通知我们。

def get_website_content():
    try:
        url = 'http://www.example.com/product/123'
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
        response = requests.get(url=url, headers=headers)
        soup = BeautifulSoup(response.text, 'html.parser')

        # 这里可以根据需要提取网站中的内容
        # 以下代码只是示例,提取商品库存信息
        stock = soup.find('div', {'class': 'stock'}).text.strip()
        return stock
    except Exception as e:
        print(e)

def monitor_website():
    product_stock = get_website_content()
    if product_stock == '缺货':
        send_email()

示例2: 监控网站是否更新

假设我们关注的是某个新闻网站的最新动态,我们可以定时地监控网站首页的更新时间,当网站更新时,触发告警邮件通知我们。

def get_website_content():
    try:
        url = 'http://www.example.com'
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
        response = requests.get(url=url, headers=headers)
        soup = BeautifulSoup(response.text, 'html.parser')

        # 这里可以根据需要提取网站中的内容
        # 以下代码只是示例,提取网站更新时间
        update_time = soup.find('div', {'class': 'time'}).text.strip()
        return update_time
    except Exception as e:
        print(e)

def monitor_website():
    website_update_time = get_website_content()
    if website_update_time != '2022-01-01 00:00:00':
        send_email()

以上就是两个实际中的示例,大家可以根据实际需要进行修改和使用。