【Python】每天还在盯着网页变化?NoNoNo!手把手教你编写自动监控机器人

【Python】每天还在盯着网页变化?NoNoNo!手把手教你编写自动监控机器人

😀

网页信息变化?无法及时查看

由于各种原因(bushi)你要申请一个软著,但是这个网站它并不会自动给你推送变更信息,于是你需要:

  1. 需要输入账号密码 → 借助 Edge浏览器密码工具补全。
  2. 为了看一眼“有没有受理”“有没有需要补正”,每天要手动登录。

目前网上有一个非常强大的插件,可以实时抓取(10s)网页变更信息并通过邮箱/短信/WebHook通知你,它就是网页更新提醒 一个浏览器插件,是一款可以监控并跟踪记录网页内容更新,并立即通知你的浏览器插件。灰常好用,并且可以自定义配置,预处理(好像要VIP)等等。

很豪,但是主包使用了,拿来抓取软著的状态信息变更,发现会失效,原因是登录过期。

所以我们使用Python来试试。

“懒惰是程序员的第一生产力”。 为了解决这个痛点,我基于 Python + Playwright 编写了一个自动化脚本,实现了:

  • 自动绕过登录(基于 Cookie 复用)。
  • 全自动监控:每隔几小时自动查询。
  • 深度抓取:不仅看数字,还能自动点进去看是哪个软件变更了状态。
  • Webhook 通知:状态一变,飞书/钉钉/微信立马收到消息。

当然你可以不用Webhook,自行更换成邮箱这些哦~

技术方案选型

在爬取版权局官网时,我遇到了两个主要坑:

  1. 动态渲染:网页是 Vue/React 构建的,数据全是异步加载,普通的 requests 库拿不到数据。
  2. 点击拦截:页面上经常会有半透明的遮罩层(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 文件。

第三步:编写核心监控脚本

这是整个系统的“大脑”。

  1. JS 注入:强行删除页面上的 .cover 遮罩层。
  2. Force Click:使用 click(force=True) 无视任何遮挡进行点击。
  3. 异常兜底:如果 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 自带的 “任务计划程序”:

  1. 打开“任务计划程序”,点击“创建任务”。
  2. 常规:勾选“不管用户是否登录都要运行”。
  3. 触发器:新建,选择“每天”,然后在高级设置里勾选“重复任务间隔”,设置为 2小时
  4. 操作:启动程序 -> 选择 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 行代码就解决了复杂的动态网页监控问题。核心思路是:

  1. 人工辅助登录 解决验证码难题。
  2. Playwright 解决动态加载和点击拦截难题。
  3. Webhook 解决信息触达难题。

如果你也是正在申请软著的学生或开发者,希望这个脚本能帮你节省宝贵的时间!

Read more

智创 AI 新视界 -- AIGC 背后的深度学习魔法:从原理到实践

智创 AI 新视界 -- AIGC 背后的深度学习魔法:从原理到实践

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的博客,正是这样一个温暖美好的所在。在这里,你们不仅能够收获既富有趣味又极为实用的内容知识,还可以毫无拘束地畅所欲言,尽情分享自己独特的见解。我真诚地期待着你们的到来,愿我们能在这片小小的天地里共同成长,共同进步。💖💖💖 本博客的精华专栏: 1. 大数据新视界专栏系列:聚焦大数据,展技术应用,推动进步拓展新视野。 2. Java 大厂面试专栏系列:提供大厂面试的相关技巧和经验,助力求职。 3. Python 魅力之旅:探索数据与智能的奥秘专栏系列:走进 Python 的精彩天地,感受数据处理与智能应用的独特魅力。 4. Java 性能优化传奇之旅:铸就编程巅峰之路:如一把神奇钥匙,深度开启 JVM 等关键领域之门。丰富案例似璀璨繁星,引领你踏上编程巅峰的壮丽征程。 5. Java 虚拟机(

IDEA 中的 AI 编程插件怎么选?Copilot / 灵码 / TRAE 实际使用对比

IDEA 中的 AI 编程插件怎么选?Copilot / 灵码 / TRAE 实际使用对比

# 【不吹不黑】Java 开发者真实体验:IDEA 三大 AI 编程插件深度对比(Copilot / TRAE / 灵码) > 本文是一篇**技术交流与使用体验记录**,仅用于分享 Java 开发过程中使用 AI 插件的真实感受与效率提升方式,不涉及任何商业推广或广告行为。 *** ## 一、写在前面:为什么要写这篇文章 过去一年,大模型能力的跃迁,直接改变了开发者的工作方式。**AI 已经不再是“写 Demo 的玩具”,而是逐渐演变为 IDE 中的“第二大脑”** 。 本文的目的非常明确: *   记录一名 **Java 后端开发者** 在真实项目中使用 AI 插件的体验 *   对比不同插件在 **补全、对话、Agent 工作流** 等方面的差异 *   帮助开发者根据自身场景选择合适的工具,而不是盲目跟风 本文所有结论,

2026 CES 聚焦 Physical AI:AI 硬件、具身智能、自动驾驶、芯片战争、机器人、显示技术等全面爆发

2026 CES 聚焦 Physical AI:AI 硬件、具身智能、自动驾驶、芯片战争、机器人、显示技术等全面爆发

2026年1月6-9日,国际消费电子展(CES 2026)在美国拉斯维加斯开幕,海内外厂商集中展示人形机器人、AI硬件、智能家居等领域的最新成果,全球科技竞争进入新阶段。CES 2026的关键主题围绕Physical AI(物理AI)展开,标志着AI从软件向实体世界的全面渗透。从NVIDIA的Rubin平台到Boston Dynamics的量产Atlas,从量子计算的商业化推进到自动驾驶的突破,技术创新正在加速从概念验证走向实际部署。芯片战争、显示技术革命以及智能家居的AI化,共同勾勒出2026年科技产业的发展蓝图。 AI 与物理AI(Physical AI)的全面爆发 Nvidia在2026年消费电子展(CES)上提前发布了全新的Vera Rubin计算平台,此次发布紧随其前代产品Blackwell在人工智能热潮推动下创造历史纪录的一年。 Nvidia高性能计算和AI基础设施解决方案高级总监Dion Harris将Vera Rubin描述为"由六个芯片组成的AI超级计算机"。这六个芯片包括Vera CPU、Rubin GPU、第六代NVLink交换机、Connect-X9网

GLM-4-9B开源大模型:超越Llama-3-8B的全能AI助手

GLM-4-9B开源大模型:超越Llama-3-8B的全能AI助手 【免费下载链接】glm-4-9b-hf 项目地址: https://ai.gitcode.com/zai-org/glm-4-9b-hf GLM-4-9B作为智谱AI最新一代GLM-4系列的开源版本,凭借在多维度评测中超越Llama-3-8B的卓越表现,为AI开发者和企业用户带来了功能全面且高性能的本地化部署选择。 行业现状:开源大模型进入性能竞赛新阶段 2024年以来,大语言模型领域呈现"开源加速、性能跃升"的显著特征。随着Meta Llama-3系列的发布,开源模型与闭源商业模型的性能差距持续缩小,8B-10B参数区间成为技术突破的焦点战场。这一量级模型兼具性能与部署灵活性,既能满足企业级应用需求,又可在消费级硬件上实现高效运行,成为推动大模型普及化的关键力量。据行业研究显示,2024年第二季度,开源大模型的企业采用率同比提升217%,其中10B以下参数模型占比超过65%。 模型亮点:全方位超越同类竞品的技术突破 GLM-4-9B在核心能力上实现了对Llama-3-8B的全面超越,通过权威评测数据构