如何用Python实现网站特定文本抓取匹配并触发邮件通知?
所需依赖库
requests:用于发送HTTP请求获取网页内容,属于第三方库需要单独安装beautifulsoup4(可选):用于解析HTML结构,过滤页面标签后仅提取文本内容做匹配,避免匹配到HTML代码里的无关字符串- 内置库
smtplib、email:用于实现邮件通知功能,不需要额外安装 schedule(可选):用于实现定时循环监测需求,比手写时间循环更灵活
前置操作
- 安装第三方依赖:执行命令
pip install requests beautifulsoup4 schedule - 若要使用邮件通知,需要提前在邮箱设置中开启SMTP服务,获取专属授权码(不要直接用邮箱登录密码)
参考代码片段
import requests import time import schedule import smtplib from bs4 import BeautifulSoup from email.mime.text import MIMEText from email.header import Header # --------------- 配置区 新手仅修改这里的参数即可 --------------- TARGET_URL = "https://你要监测的网站地址.com" # 替换为目标网站链接 TARGET_STR = "你要匹配的特定字符串" # 替换为要检测的字符串 CHECK_INTERVAL = 300 # 监测间隔,单位为秒,默认配置为5分钟 # 邮件通知配置 SMTP_SERVER = "smtp.qq.com" # 邮箱SMTP服务器,QQ邮箱为smtp.qq.com,163邮箱为smtp.163.com SMTP_PORT = 465 SENDER_EMAIL = "发件人邮箱@qq.com" SENDER_AUTH_CODE = "你的邮箱SMTP授权码" # 填写邮箱开启SMTP后获取的授权码 RECEIVER_EMAIL = "收件人邮箱@xxx.com" # --------------------------------------------------------- def send_email_alert(): """触发匹配后发送预警邮件""" message = MIMEText(f"网站{TARGET_URL}监测到目标字符串「{TARGET_STR}」,请及时查看", 'plain', 'utf-8') message['From'] = Header("网站监测脚本", 'utf-8') message['To'] = Header("收件人", 'utf-8') message['Subject'] = Header("网站匹配预警通知", 'utf-8') try: smtp_obj = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) smtp_obj.login(SENDER_EMAIL, SENDER_AUTH_CODE) smtp_obj.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, message.as_string()) smtp_obj.quit() print("预警邮件发送成功") except Exception as e: print(f"邮件发送失败:{e}") def check_website(): """请求目标网站并匹配字符串""" # 模拟浏览器请求头,避免被反爬机制拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } try: response = requests.get(TARGET_URL, headers=headers, timeout=10) response.encoding = response.apparent_encoding # 自动识别编码避免中文乱码 # 提取页面纯文本内容,过滤HTML标签 soup = BeautifulSoup(response.text, 'html.parser') page_text = soup.get_text() # 匹配字符串,如需忽略大小写可以改成 TARGET_STR.lower() in page_text.lower() if TARGET_STR in page_text: print("匹配到目标字符串,触发通知") send_email_alert() # 如需匹配到一次就停止脚本,解开下面的注释 # schedule.cancel_job(check_job) else: print(f"{time.strftime('%Y-%m-%d %H:%M:%S')} 未匹配到目标字符串") except Exception as e: print(f"请求网站失败:{e}") if __name__ == "__main__": # 启动时先执行一次检测 check_website() # 设置定时任务 check_job = schedule.every(CHECK_INTERVAL).seconds.do(check_website) # 循环运行任务 while True: schedule.run_pending() time.sleep(1)
使用调整说明
- 如果不需要定时执行,删掉schedule相关的代码,直接调用
check_website()函数即可 - 如果不需要过滤HTML标签直接匹配整个响应内容,可以删掉BeautifulSoup相关的代码,直接用
TARGET_STR in response.text判断 - 除了邮件通知,也可以替换成企业微信/钉钉机器人通知,只要把发送邮件的函数改成调用对应机器人的webhook接口即可
- 部分网站有反爬机制,若请求返回403/503等错误,可以尝试在headers中加Cookie、Referer等请求头参数
- 脚本需要保持后台运行才能持续监测,Linux服务器可以用nohup挂起,Windows可以把脚本改成后台服务运行
内容的提问来源于stack exchange,提问作者salatpl
相关产品推荐
相关产品推荐

