核心是精准定位html区域而非监控全页,用beautifulsoup提取指定id/class内容并标准化空白符;动态内容需playwright/selenium;历史快照存sqlite防重复通知;邮件需专用密码、正确smtp配置及utf-8编码;轮询用schedule或系统cron保障可靠性。

用 requests + BeautifulSoup 抓取页面并提取关键词内容
核心不是“监控整个网页”,而是定位到你真正关心的那块 HTML 区域——比如某个 <div id="news-list"> 或带特定 class 的 <code><p></p> 标签。直接全文比对 MD5 容易误报(广告位变动、时间戳刷新、埋点脚本加载顺序不同都会导致哈希变化)。
实操建议:
- 先用浏览器开发者工具定位关键词所在容器,复制其
id或class,写进soup.find()或soup.select() - 提取文本后用
.strip().replace('\n', ' ').replace('\t', '')标准化空白符,避免换行差异干扰比对 - 如果关键词本身是动态 JS 渲染的,
requests拿不到,得换playwright或selenium,但会显著拖慢频率和资源消耗
用文件或 SQLite 存储历史快照,避免每次全量重爬
把上次抓到的关键词区域文本存成纯文本文件(如 cache/20240512_keyword_section.txt),下次只读这个文件做字符串比对。别用内存变量或全局 dict —— 程序重启就丢了。
更稳妥的做法是用轻量级 sqlite3:
- 建表:
CREATE TABLE IF NOT EXISTS snapshots (url TEXT, section_hash TEXT, updated_at TIMESTAMP) - 每次更新前查最新一条
section_hash,和当前计算出的hashlib.sha256(text.encode()).hexdigest()[:16]对比 - 只在 hash 不同时才写入新记录并触发邮件,避免重复通知
用 smtplib 发邮件时绕过常见拦截和认证失败
国内邮箱(如 QQ、163)默认禁用 SMTP,必须手动开启“POP3/SMTP 服务”并在设置里生成专用密码——不是你的登录密码。否则会报 SMTPAuthenticationError 或静默失败。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
关键配置点:
- QQ 邮箱 SMTP 服务器地址是
smtp.qq.com,端口用587(TLS)或465(SSL),别混用 - 发件人地址必须和登录账号一致,否则很多企业邮箱会拒收;收件人可写多个,用逗号分隔,但要确保
msg['To']字段格式正确 - 邮件正文务必设
Content-Type: text/plain; charset=utf-8,否则中文可能乱码;标题加=?UTF-8?B?base64 编码更保险
用 schedule 或系统 cron 控制轮询频率,别用死循环 + sleep
while True: do_work(); time.sleep(300) 看似简单,但程序崩溃或机器重启后就停了,且无法精确控制执行时间点(比如“每天上午 9:00 检查”)。
推荐方案:
- 轻量场景用
schedule库:schedule.every(10).minutes.do(check_update),再起个后台线程跑schedule.run_pending() - 生产环境直接上系统级
cron(Linux/macOS)或任务计划程序(Windows),保证可靠性;脚本本身只做单次检查,不带状态 - 注意:高频轮询(如每分钟)可能被目标站封 IP,加
headers={'User-Agent': 'Mozilla/5.0 ...'}是基础,必要时配合代理池
真正的难点不在代码拼凑,而在判断“什么是有效更新”——比如新闻页标题变了但正文没动,算不算?评论区新增一条留言要不要通知?这些逻辑得贴着业务来定,没法靠通用爬虫框架自动解决。










