跳到主内容

公开榜单排名追踪 - 免费抓两次榜单,自动告诉你谁升谁降、谁新上榜(爬虫工具)

免费下载公开榜单排名追踪 v1.0.0
平台:Windows 10/11 (64位)大小:11.3 MB版本:v1.0.0更新:2026-09-30
下载地址 ▾
解压后双击即可运行,无需安装任何运行环境;只在你点击抓取时访问你填写的网址,其余数据都在本机处理。
想跟踪某公开榜单的排名变化,每天手工截图对比太累,也看不出谁升谁降

公开榜单排名追踪 运行界面

软件名称公开榜单排名追踪
版本v1.0.0
授权免费(可自由使用与转发)
运行方式本地运行,仅抓取时访问你填写的网址
所属分类爬虫工具

这个工具解决什么问题

做运营、做市场、看行业动态的人,常常要盯一个榜单:某个平台的热销排行、某个社区的 Star 榜、某个行业的影响力指数。想知道「这周比上周有什么变化」,现在的做法基本只有一招——每天把榜单页截图存下来,攒够几张再并排看。麻烦就在这儿:截图只能看出「现在是什么样」,看不出「跟上次比变了什么」。名次从 9 升到 6 这种变化,得拿两张图一行一行对,眼睛看花了还容易漏。要是榜单有三五十条,对一遍就是十几分钟。更麻烦的是过一阵子回头想复盘「这个条目是哪天开始往上走的」,翻满是时间戳的截图文件夹,基本找不到。

  • 原来的做法:每天打开榜单页截一张图存进文件夹;要对比的时候把两张图并排摊开,一行一行用眼睛找差异,再用记事本手动记下「某某上升 3 位」
  • 用这个工具:把榜单网址粘进程序点一次「抓取并记录」,程序把榜单存成一份快照;下次再点一次,表格里直接列出本次排名、名称、上次排名和变化(↑ 上升 N 位 / ↓ 下降 N 位 / ● 新上榜 / × 已下榜),点一下就能导出成 CSV
  • 省下来的:一次对比从十几分钟压到几秒,变化不用再靠眼睛找,历史记录还能一直留着自己复盘

技术实现

整个工具只用 Python 标准库(urllib + html.parser + tkinter + json + csv),运行期不需要安装任何依赖,打包后是单个 exe,双击即用。技术上有四个刻意的取舍:第一,解析 HTML 表格不引 BeautifulSoup 或 lxml,而是基于标准库的 HTMLParser 自己写一层「结构 -> 文本网格」的收集器——本工具只需要 table 这一种结构,为它引入几十 MB 的第三方库会让单文件 exe 体积翻好几倍;第二,把「哪张表是榜单、哪一列是排名」交给打分而不是写死列号,因为不同站点的榜单列序完全不同,写死必错;第三,界面与核心逻辑彻底分离,核心层不 import 任何 GUI 库,这样可以脱离界面跑全自动回归测试;第四,抓取前先读 robots.txt,被明确禁止就停下,不做「先抓了再说」。

  • 自写 HTML 表格解析:rowspan / colspan 展开不串列:_TableCollector 继承 html.parser.HTMLParser,用栈保存未闭合的 <table> 以支持嵌套,只把文本收进最内层单元格。_expand_grid() 维护 pending[列号] = {text, left} 记录跨行单元格的剩余行数,每写一个真实单元格前先补齐左侧的悬空占位,这样「某列 rowspan=2」在第二行同列会正确留空而不是把后面的列整体左移——这正是手工复制粘贴网页表格最容易出错的地方。colspan 同样按列宽展开;畸形页面(未闭合标签、colspan="99999")有 MAX_SPAN=50 上限兜底。
  • 榜单识别靠打分,不写死列号:detect_ranking() 给每个候选表、每一列打分。排名列得分 = 整数单元格占比 × 0.7 + 相邻不下降比例 × 0.3:只判断「是不是整数」不够,Star 数、成交量也全是整数,加上单调性这一项才能把数值列压下去(实测示例页里排名列 1.0 分、Star 列 0.7 分)。名称列得分 = 平均文本长度 × 取值去重率:名称比「语言」「类型」这类字段长且基本唯一,纯数字单元格(含千分位、百分号)不计入平均。表的综合分 = 行数 ×(有排名列 ? 1.0 : 0.3)+ min(名称列得分, 20),行数少于 3 的表直接排除但仍记入候选列表并注明原因。
  • 识别失败不报错,退回可选状态让用户两下点回来:自动识别没有把握时,程序不抛错退出,而是退回「行数最多的那张表」、排名列留空(按行序编号),并把「榜单区域 / 排名列 / 名称列」三个下拉框填好样例值(如「第2列 · datafusion-rs / tabulator-x」),用户点两下再按「按当前列设置重新解析」即可。解析结果会直接覆盖本次快照,不会多记一期。
  • 对比算法:同名条目一一配对,不误判升降:compare() 先建 {名称: [出现位置...]} 索引,比对时取第一个还没被用过的位置。如果只做 name->rank 的字典映射,榜单里出现两个同名占位行(很多榜单有「暂无数据」)时,第二个会被误判成「新上榜」、上期那条被误判成「已下榜」。上期在榜、本期消失的条目单独归入「已下榜」列在表格末尾,名次照旧保留。
  • 合规:抓之前先读 robots.txt,并做同域限速:check_robots() 读取站点根的 robots.txt,解析 User-agent 分组下的 Allow / Disallow 前缀规则,最长前缀命中者生效、同长时 Allow 优先(与主流搜索引擎一致)。被禁止时不继续抓取,而是提示用户「可以另存为 HTML 后用本地文件模式」。另有 MIN_HOST_INTERVAL=2 秒的同域请求间隔,一次操作只发一个请求、不做并发。已知局限:不解析 * 和 $ 通配符,遇到当普通字符处理——属于宁可保守的取舍。
  • 编码嗅探与中文站点兼容:编码判定顺序:BOM → HTTP Content-Type 的 charset → HTML meta 声明 → 直接试 UTF-8 → 试 GB18030 → 兜底 latin-1。判定到 gb2312 / gbk 一律升级成 gb18030(超集,避免生僻字解码失败)。所有网络异常(401/403/404/429/500/超时/域名解析失败)都翻译成中文提示,例如 404 显示「页面不存在,请检查网址是否拼写正确」,绝不把 Python 堆栈弹给用户。
  • 后台线程 + 队列,界面不假死:tkinter 控件只能主线程操作,抓取与解析放在 threading.Thread 里,通过 queue.Queue 回传 status / error / ok 三类消息,主线程用 root.after(80, self._pump) 轮询消费并刷新进度条。任务期间禁用全部按钮、进度条切成不确定模式。未捕获异常同时挂在 sys.excepthook 与 root.report_callback_exception 上,写 %TEMP%\rank_watch_crash.log 并弹窗——GUI 程序没有控制台,不弹窗用户只会以为「点了没反应」。

技术栈:Python 3.8+、零第三方依赖(纯标准库)、tkinter 图形界面、html.parser 自写表格解析、PyInstaller 单文件打包

已知局限:只解析静态 HTML,不执行页面里的 JavaScript,所以完全由 JS 渲染出来的榜单抓不到(界面里会提示改用「浏览器另存为 HTML + 选择本地文件」这条离线路径)。只识别 <table> 结构的榜单,用 div / ul 排版的列表不支持。robots 判定不支持 * 和 $ 通配符。一次只处理一个榜单,不支持批量;没有内置定时任务,需要自己隔几天手动抓一次。导出是 CSV,不直接生成 Excel 图表或折线图。

操作教程

  1. 打开程序,粘贴榜单网址
    双击「公开榜单排名追踪.exe」。在「榜单网址」输入框里粘贴公开榜单页的地址(不用带 https:// 也行,程序会自动补全)
    预期结果:窗口打开,输入框里出现你粘的地址
  2. 点「抓取并记录」
    点蓝色按钮「抓取并记录」,状态栏会依次显示「正在检查 robots 协议…」「正在下载页面…」「正在解析表格…」
    预期结果:几秒后表格里出现榜单条目:本次排名、名称、上次排名、变化;下方状态栏显示抓取字节数、页面编码、耗时,以及「本次记录 N 条」
  3. 确认识别结果(挑错了就在这里改)
    看「识别结果」那一行说明,例如「第 2 张表格共 12 行;排名列=第 1 列;名称列=第 2 列」。如果挑错了表或挑错了列,就在「榜单区域 / 排名列 / 名称列」三个下拉框里自己选(下拉框里带样例值,一眼看得出是哪一列),再点「按当前列设置重新解析」
    预期结果:表格内容立刻按新的列设置刷新;这次解析会覆盖本次记录,不会多记一期
  4. 隔一段时间再抓一次同一个榜单
    第二天、下一周都行。再次粘同一个网址点「抓取并记录」
    预期结果:「变化」列出现结果:↑ 上升 N 位(蓝)、↓ 下降 N 位(橙)、— 持平(灰)、● 新上榜(绿);已下榜的条目排在表格末尾,显示 × 已下榜。下方状态栏给出统计,如「1 升 / 7 降 / 2 持平 / 2 新上榜 / 2 已下榜」
  5. 导出对比报告
    点「导出对比报告 CSV…」,选保存位置
    预期结果:生成的 CSV 用 Excel 双击打开中文不乱码(文件带 UTF-8 BOM),开头几行写明数据来源、本期与上期时间、统计,后面是「状态 / 本次排名 / 名称 / 上次排名 / 名次变化」明细
  6. 查看历史与存档
    点「打开存档目录」可以打开本工具的数据目录,每个榜单一个子目录,一期一个快照,全部是明文 JSON,可以直接看。想重新开始就点「清空本榜单历史」
    预期结果:资源管理器打开 %APPDATA%\PublicRankWatch\ 下的对应目录;清空前会二次确认,且只删本工具自己的存档文件,不影响任何原文件
  7. 榜单是 JS 动态渲染的怎么办
    如果提示「没有找到可用的数据表格」,用浏览器打开那个榜单页,按 Ctrl+S 另存为「网页,仅 HTML」,再点界面上的「选择 HTML 文件…」载入那个文件
    预期结果:程序读本地文件解析,流程与联网抓取完全一样(这条路纯离线,不联网也能用)

第一次抓取时「变化」列全部显示首次记录,这是正常的——变化要有两期才能算。第二次抓同一个榜单就能看到升降了。

常见问题

Q:第一次抓完,变化列全是「新上榜」,是不是坏了?A:不是。变化需要两期才能算出来。第一次抓取只是把榜单记下来,第二行起显示的「上次排名」是空的,所以全部计为新上榜。隔一段时间再抓一次同一个榜单,就会看到 ↑ / ↓ / — / ● / × 这五种结果。
Q:提示「没有找到可用的数据表格」怎么办?A:三种常见原因:一是榜单由 JavaScript 动态渲染,本工具只解析静态 HTML——在浏览器里按 Ctrl+S 另存为「网页,仅 HTML」,再用「选择 HTML 文件…」载入;二是榜单不是 <table> 结构(用 div 排版),本工具暂不支持;三是页面需要登录才能看到内容。
Q:程序挑错了表格,或者把 Star 数当成了名称列怎么办?A:在「榜单区域 / 排名列 / 名称列」三个下拉框里手动选正确的列——下拉框的每一项都带样例值(如「第2列 · datafusion-rs / tabulator-x」),一眼就能认出哪列是名称。选完点「按当前列设置重新解析」即可,这次解析会覆盖本次记录。
Q:会抓取需要登录、或者网站明令禁止抓取的页面吗?A:不会。程序在抓取前会先读目标站点的 robots.txt,如果该路径被 Disallow 明确禁止,程序会停下来并提示你,不会绕过限制。请只用于公开可见或你有权限访问的页面。
Q:数据会上传到服务器吗?A:不会。榜单解析、比对、存档全部在本机完成,程序只在你点「抓取并记录」时向目标榜单页发一个 GET 请求,除此之外不联网、不上传任何数据。用「选择 HTML 文件…」本地文件模式时更是完全离线。
Q:历史记录存在哪里?换电脑会丢吗?A:存在 %APPDATA%\PublicRankWatch\ 下,按榜单分目录,一期一个 JSON 快照,每个榜单最多保留最近 60 期。点界面上的「打开存档目录」可以直接打开,复制这个目录就能把历史搬到别的机器。
Q:支持一次抓多个榜单吗?能定时自动抓吗?A:目前一次只处理一个榜单,也没有内置定时任务——需要隔几天自己点一次。如果想要「一次盯多个榜单」「每天自动抓并推到群里」「画出排名变化折线图」这类能力,可以联系我们做二次开发定制。

技术实现与后续维护

本工具由我们自行开发并持续维护,每次改动都在本地跑过完整自测(102 项断言全绿才算改完)。结构上刻意把核心逻辑与界面分开:core 层不依赖任何 GUI 库,解析、识别、比对、存储都是可独立调用的纯函数,改起来容易验证;抓取前先读 robots.txt,被禁止时停下而不是绕过;存档用「临时文件 + 原子替换」写入,损坏时也不会删用户的文件。下面说明它的技术构成与可扩展方向,方便你判断是否契合自己的场景。

技术构成:

  • 核心逻辑层(rank_core.py) —— 取数、解析、识别、存储、比对、导出六个部分,不 import 任何 GUI 库,可脱离界面单独跑回归测试
  • 表格解析(_TableCollector / _expand_grid) —— 基于标准库 html.parser 的表格收集器,支持嵌套表格,把 rowspan / colspan 展开成等宽文本网格
  • 榜单识别(detect_ranking) —— 排名列用「整数占比 + 单调性」打分,名称列用「平均长度 × 去重率」打分,选综合分最高的表
  • 存储(SnapshotStore) —— 按数据源分目录的一期一快照存储,原子写入、上限 60 期、损坏时不删用户文件
  • 界面层(rank_watch_gui.py) —— tkinter 窗体:来源输入区、排名变化表格、导出与历史操作区;耗时任务走后台线程 + 队列回传刷新
  • 自测(selftest.py) —— 102 项断言,含一个临时本地 HTTP 服务做端到端抓取验证,全程不访问外网站点

运行环境:

运行环境:Windows 10/11(64 位)。免安装——解压后双击 exe 即可,不需要装 Python、不需要联网、不需要任何运行库。程序只在点「抓取并记录」时向目标页发一个请求,其余时间完全不联网。运行内存占用视页面大小而定(一次最多读取 8MB HTML,最多记录 300 条)。

可扩展方向:

  • 一次配置多个榜单网址,串行抓取并汇总成一份对比报告
  • 关键词跟踪:只盯榜单里的某几个条目,变动时高亮或单独列出
  • 配合 Windows 任务计划做每日自动记录,并画成排名变化折线图
  • 支持 JSON 接口、RSS 以及 div / ul 列表结构的榜单(目前只认 table)
  • 导出 Excel(xlsx)、Markdown 表格,或推送变动摘要到企业微信 / 钉钉群
  • 把快照落进数据库,做长期趋势与多榜单横向对比

本工具免费提供使用,但不对外分发源码。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发,源码与工程文档可在定制合作中一并交付。

需要其它功能?可以定制

这个工具只做一件事:想跟踪某公开榜单的排名变化,每天手工截图对比太累,也看不出谁升谁降。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。

常见的定制需求:

  • 一次盯 10 个平台的热销榜,每天早上自动抓一遍并把升降汇总成一张表
  • 只关心榜单里出现的自家与竞品条目,名次一变就推送到工作群
  • 把排名变化接进你们的 BI,做成趋势曲线给老板看
  • 对接内网需要带 Cookie 访问的榜单(使用方需确认有合法权限)
  • 按你们的模板生成周报:抓取 + 对比 + 套版导出 Word
  • 联系方式:邮箱/微信见站内「联系我们」页面,或在本文下方留言
  • 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
  • 交付形式:定制项目可交付可执行程序,按需一并交付源码与工程文档,支持长期维护

使用说明与免责声明

本工具涉及数据采集,请在合法合规的前提下使用。
  • 本工具仅用于采集公开可见或你自身拥有权限的数据。
  • 请遵守目标网站的服务条款、robots 协议及《网络安全法》等相关法律法规。
  • 请合理控制请求频率,不要对目标站点造成访问压力。
  • 不得用于采集个人隐私、付费墙内容或任何受法律保护的非公开数据。
  • 因使用不当造成的后果由使用者自行承担;本工具不做数据二次分发。
免费下载公开榜单排名追踪 v1.0.0
平台:Windows 10/11 (64位)大小:11.3 MB版本:v1.0.0更新:2026-09-30
下载地址 ▾
解压后双击即可运行,无需安装任何运行环境;只在你点击抓取时访问你填写的网址,其余数据都在本机处理。
分享到:

本文链接:https://www.biyeyuanma.cn/post/253.html

服务热线

加我微信

加我微信