【Python】每天还在盯着网页变化?NoNoNo!手把手教你编写自动监控机器人
本文介绍了一个基于Python和Playwright的自动化脚本,用于监控软著申请状态变更。该脚本通过Cookie复用实现自动登录,定时查询官网数据,并利用Webhook推送状态变化通知。主要解决了动态网页渲染、点击拦截等难题,通过保存登录状态、强制点击等技术实现稳定监控。文章详细讲解了环境配置、Cookie获取、核心监控逻辑及部署方案,提供了一套完整的自动化解决方案,帮助开发者摆脱手动刷新页面的
😀
网页信息变化?无法及时查看
由于各种原因(bushi)你要申请一个软著,但是这个网站它并不会自动给你推送变更信息,于是你需要:
- 需要输入账号密码 → 借助 Edge浏览器密码工具补全。
- 为了看一眼“有没有受理”“有没有需要补正”,每天要手动登录。
目前网上有一个非常强大的插件,可以实时抓取(10s)网页变更信息并通过邮箱/短信/WebHook通知你,它就是网页更新提醒 一个浏览器插件,是一款可以监控并跟踪记录网页内容更新,并立即通知你的浏览器插件。灰常好用,并且可以自定义配置,预处理(好像要VIP)等等。
很豪,但是主包使用了,拿来抓取软著的状态信息变更,发现会失效,原因是登录过期。
所以我们使用Python来试试。
“懒惰是程序员的第一生产力”。 为了解决这个痛点,我基于 Python + Playwright 编写了一个自动化脚本,实现了:
- ✅ 自动绕过登录(基于 Cookie 复用)。
- ✅ 全自动监控:每隔几小时自动查询。
- ✅ 深度抓取:不仅看数字,还能自动点进去看是哪个软件变更了状态。
- ✅ Webhook 通知:状态一变,飞书/钉钉/微信立马收到消息。
当然你可以不用Webhook,自行更换成邮箱这些哦~

技术方案选型
在爬取版权局官网时,我遇到了两个主要坑:
- 动态渲染:网页是 Vue/React 构建的,数据全是异步加载,普通的
requests库拿不到数据。 - 点击拦截:页面上经常会有半透明的遮罩层(Cover),导致模拟点击失效。
因此,最终选型为 Playwright。它比 Selenium 更快、更轻量,且能完美处理动态渲染和抗检测。
第一步:环境准备与加速
由于 Playwright 需要下载浏览器内核,国内网络可能会失败。我们可以使用国内镜像源加速。
# 1. 安装 Python 库(使用清华源)
pip install playwright requests -i <https://pypi.tuna.tsinghua.edu.cn/simple>
# 2. 设置 Playwright 浏览器下载镜像(Windows PowerShell)
$env:PLAYWRIGHT_DOWNLOAD_HOST="<https://npmmirror.com/mirrors/playwright/>"
# 3. 安装浏览器内核
playwright install
第二步:搞定登录(Cookie 也就是“门票”)
版权局的验证码很难破解,但我们不需要每次都破解。我们只需要人工登录一次,保存下 Cookie,以后脚本拿着这个 Cookie 就能骗过服务器。
编写 get_cookie.py:
from playwright.sync_api import sync_playwright
def save_login_manually():
with sync_playwright() as p:
# headless=False 表示显示浏览器界面,方便我们要手动操作
browser = p.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
print(">>> 正在打开登录页面...")
page.goto("<https://register.ccopyright.com.cn/login.html>")
print("【请配合执行】请在弹出的浏览器中手动登录,直到看到后台列表页面。")
input(">>> 登录成功后,请回到这里按回车键 (Enter) 保存状态...")
# 核心:保存 Cookie 和 LocalStorage 到文件
context.storage_state(path="auth.json")
print(">>> 登录状态已保存至 auth.json")
browser.close()
if __name__ == "__main__":
save_login_manually()
运行后,手动登录一次,目录下就会多一个 auth.json 文件。
第三步:编写核心监控脚本
这是整个系统的“大脑”。
- JS 注入:强行删除页面上的
.cover遮罩层。 - Force Click:使用
click(force=True)无视任何遮挡进行点击。 - 异常兜底:如果 Cookie 过期或网络超时,立即发送报警通知。
编写 monitor.py:
import os
import json
import time
import requests
from playwright.sync_api import sync_playwright
# --- 配置区 ---
AUTH_FILE = "auth.json"
DATA_FILE = "last_status.json"
# 替换为你的 Webhook (飞书/钉钉/企业微信)
WEBHOOK_URL = "你的webhook地址"
TARGET_URL = "<https://register.ccopyright.com.cn/account.html?current=soft_register>"
WATCH_LIST = ["待受理", "待审查", "待补正", "待发放", "已发放"]
def send_notification(content):
"""发送 Webhook 通知"""
try:
payload = {"msgtype": "text", "text": {"content": content}, "content": content}
requests.post(WEBHOOK_URL, json=payload, timeout=10)
except Exception as e:
print(f"通知发送失败: {e}")
def run_monitor():
# 1. 检查凭证
if not os.path.exists(AUTH_FILE):
send_notification("【⚠️ 报警】找不到 auth.json,请重新运行登录脚本!")
return
current_data = {}
with sync_playwright() as p:
# 生产环境使用 headless=True (无头模式)
browser = p.chromium.launch(headless=True)
context = browser.new_context(storage_state=AUTH_FILE)
page = context.new_page()
try:
print(f">>> [{time.strftime('%H:%M:%S')}] 开始检查...")
page.goto(TARGET_URL)
page.wait_for_load_state("networkidle")
# 2. 检查是否掉线
if "login" in page.url:
raise Exception("Cookie已失效,跳转回了登录页")
page.wait_for_selector("text=待受理", timeout=30000)
time.sleep(2)
# 3. 【黑科技】强力清除页面遮罩
try:
page.evaluate("document.querySelectorAll('.cover').forEach(el => el.remove());")
except: pass
# 4. 遍历抓取
for status_name in WATCH_LIST:
# 定位标签
tab_locator = page.locator(f"li.title-item:has-text('{status_name}')")
# 获取右上角数字
badge_locator = tab_locator.locator("sup")
count = int(badge_locator.inner_text().strip()) if badge_locator.count() > 0 else 0
software_names = []
if count > 0:
# 【黑科技】强制点击,无视遮挡
tab_locator.click(force=True)
time.sleep(1.5) # 等待列表刷新
# 抓取列表里的名字
software_names = [el.inner_text().strip() for el in page.locator(".opusName > p").all() if el.inner_text().strip()]
current_data[status_name] = {"count": count, "names": software_names}
except Exception as e:
err_msg = f"【⚠️ 监控失败】脚本运行出错: {str(e)[:100]}"
print(err_msg)
send_notification(err_msg)
browser.close()
return
browser.close()
# 5. 数据比对与通知
last_data = {}
if os.path.exists(DATA_FILE):
try:
with open(DATA_FILE, "r", encoding="utf-8") as f: last_data = json.load(f)
except: pass
if current_data != last_data:
print(">>> 状态变化,发送通知...")
msg_lines = ["【软著状态变更提醒】", f"时间: {time.strftime('%m-%d %H:%M')}"]
msg_lines.append("-" * 20)
has_content = False
for status, info in current_data.items():
if info['count'] > 0:
msg_lines.append(f"● {status} ({info['count']})")
for i, name in enumerate(info['names'], 1):
msg_lines.append(f" {i}. {name}")
msg_lines.append("")
has_content = True
if not has_content: msg_lines.append("当前队列为空。")
send_notification("\\n".join(msg_lines))
with open(DATA_FILE, "w", encoding="utf-8") as f:
json.dump(current_data, f, ensure_ascii=False, indent=2)
else:
print(">>> 数据无变化。")
if __name__ == "__main__":
run_monitor()
第四步:效果展示
脚本运行后,一旦状态发生变更,我的手机就会收到这样的推送:

再也不用在那干等着刷新了!
第五步:自动化部署
脚本写好了,怎么让它 7x24 小时运行呢?
如果你是Windows系统最简单的方法是使用 Windows 自带的 “任务计划程序”:
- 打开“任务计划程序”,点击“创建任务”。
- 常规:勾选“不管用户是否登录都要运行”。
- 触发器:新建,选择“每天”,然后在高级设置里勾选“重复任务间隔”,设置为 2小时。
- 操作:启动程序 -> 选择 Python 路径 -> 参数填
monitor.py-> 起始于 (Start in) 填脚本所在文件夹路径。
这样,即使你在睡觉,脚本也在不知疲倦地为你工作。
如果你是Linux,那么可以添加到守护进程,或者直接暴力循环(手动狗头)
if __name__ == "__main__":
while True:
print(f"\\n>>> [{time.strftime('%Y-%m-%d %H:%M:%S')}] 开始执行监控任务...")
try:
run_monitor()
except Exception as e:
print(f">>> 运行出错: {e}")
print(">>> 任务完成,等待 2 小时后再次运行...")
# 2小时 = 2 * 60 * 60 = 7200 秒
time.sleep(7200)
🤗总结
通过 Python Playwright,我们只用了不到 200 行代码就解决了复杂的动态网页监控问题。核心思路是:
- 人工辅助登录 解决验证码难题。
- Playwright 解决动态加载和点击拦截难题。
- Webhook 解决信息触达难题。
如果你也是正在申请软著的学生或开发者,希望这个脚本能帮你节省宝贵的时间!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)