最轻量可控的网页监控方案是requests轮询+hashlib内容指纹+微信webhook;需提取语义块而非整页html,用lxml/bs定位目标元素并哈希文本,存指纹到本地文件,配置化css选择器以应对结构变更。

直接用 requests 轮询 + hashlib 做内容指纹,再调用微信官方 POST /cgi-bin/webhook/send 接口,是最轻量、最可控的方案。别碰 Selenium 或无头浏览器——只要网页不依赖 JS 渲染,它们纯属增加失败点和延迟。
怎么判断网页内容真变了,而不是时间戳/广告位抖动?
关键不是“整个 HTML 是否一致”,而是提取你关心的语义块。比如监控招标公告,真正要报警的是「报名截止时间」或「开标日期」字段;监控价格页,盯住 <span class="price"></span> 里的数字即可。
- 用
lxml或BeautifulSoup解析 HTML,用 CSS 选择器或 XPath 定位目标元素,.text.strip()提取干净文本 - 对提取结果做
hashlib.md5(text.encode()).hexdigest(),存为上一次的指纹(不要存原始 HTML) - 避免用
time.time()或datetime.now()当变化依据——页面里自带的更新时间字段才可信 - 如果目标元素可能为空(如未发布),统一 fallback 为
"N/A",防止空值导致误报
微信报警为什么发不出去?常见 HTTP 错误怎么快速定位?
企业微信机器人 Webhook 失败,90% 出在请求头、签名或 JSON 格式上,不是网络问题。
- 必须带
Content-Type: application/json,漏了就返回415 Unsupported Media Type - Webhook URL 末尾不能有多余空格或换行,复制时容易带入 —— 用
url.strip()预处理 - 消息体必须是合法 JSON:
{"msgtype": "text", "text": {"content": "变化了!"}},注意双引号、逗号、括号闭合 - 返回
400且 body 是{"errcode":40002,"errmsg":"invalid media_type"}?说明你传了multipart/form-data,改用json=...参数发请求
定时轮询怎么不被封、不拖垮自己机器?
没有“绝对安全”的间隔,只有“根据目标网站反爬强度动态妥协”的策略。
- 起手先设
time.sleep(300)(5 分钟),观察 24 小时是否稳定;能跑通再逐步缩到 60 秒,但别低于 30 秒 - 加
headers={"User-Agent": "Mozilla/5.0 (X11; Linux x86_64)..."},用常见浏览器 UA,别用默认python-requests - 每次请求后检查响应状态码:
if r.status_code != 200就跳过比对、记录日志,避免错误内容污染指纹 - 把指纹存本地文件(如
./cache/{domain}_fingerprint.txt)比存在内存里更可靠——程序崩了也不丢状态
最麻烦的永远不是发消息,而是网页结构某天突然改了 class 名或 DOM 层级,导致 selector 失效。建议把选择器写进配置文件,每次变更只需改一行,不用动逻辑代码。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











