GitHub趋势自动化速递:从API事件流到每日榜单实践
每天点开 GitHub Trending 页面几乎成了我过去几年雷打不动的习惯。但说句实话这个习惯一度非常消耗精力早上通勤路上刷一遍中午午休再刷一遍晚上睡前还要刷一遍。很多仓库的涨星速度非常快稍不注意就错过整个讨论热点的来龙去脉。后来我把这件事做成了一套自动化的每日趋势速递用脚本定时抓取、整理、评分、推送到我自己的信息渠道里坚持跑了很长一段时间整体收益远超预期。这篇内容不是简单地晒成果而是把项目的核心设计、数据源选型、排序算法、踩坑经验完整拆开分享给同样对 GitHub 趋势感兴趣、也想自己搭一套自动化情报流的开发者。1. 核心需求与整体设计思路1.1 为什么要把“刷趋势”自动化先说一个很多人可能没意识到的现象GitHub 官方的 Trending 页面只展示过去一个时间窗口内涨星明显的仓库但这个窗口的计算逻辑并不透明而且不同地区、不同登录状态看到的榜单有明显差异。更麻烦的是官方页面没有提供任何公开 API你要想拿到结构化数据要么自己做网页解析要么借助第三方平台。每天手工刷一遍看到的是碎片信息很难形成对技术演进的连续观察。我当时给自己定的目标是每天拿到一份包含仓库名、描述、语言、今日新增 Star、总 Star、提交活跃度、项目健康度的清单同时附带上“为什么这个仓库值得关注”的简短标注。这样才能把趋势从“围观”变成“分析”。自动化之后我不再需要打开浏览器每天固定时间点收到整理好的报告看到的关键信息密度比手工刷高得多。这个项目还有一个隐藏价值长期积累趋势数据之后可以复盘一个仓库从爆火到沉寂的完整生命周期这在做技术选型和方向判断时非常有用。所以我在设计之初就要求数据必须落库不能全部丢弃。1.2 数据源选型API 还是爬虫项目第一步卡在数据源上。GitHub 不提供官方 Trending API可行的路线有三条。第一条是直接解析 GitHub Trending 页面 HTML。这条路看起来简单实际上非常脆弱。页面结构隔三差五就会变React 渲染后的 DOM 层级复杂翻页逻辑还依赖前端状态写好的解析器过两周可能就拿到一堆空数据。而且官方页面本身并不提供“过去 24 小时新增 Star”这种精细字段能拿到的信息有限。第二条是找第三方趋势统计平台。部分平台通过 GitHub 事件流计算仓库热度变化会提供类似 star 增长曲线的数据。问题是稳定性不可控有的平台免费额度极低有的输出格式大改之后直接把下游脚本干崩。第三条也是我最终采用的方案基于 GitHub Events API 和 Repositories API 做数据拼装。GitHub 官方有一个公开的 Events 接口能实时返回全站范围内的 WatchEvent、PullRequestEvent、IssueCommentEvent 等事件流。通过抓取这些事件流中的 WatchEvent也就是 star 行为可以计算出任意仓库在指定时间窗口内的新增 Star 数。再结合 Repositories API 里的仓库元信息自己拼装出类似 Trending 的榜单并且字段完全可控。这条路的代价是实时事件流的数据量非常大需要消耗不少 API 配额。但好处也非常明显数据来源完全可靠字段丰富排序和计算逻辑全部由自己掌控。我强烈建议任何想长期做这类项目的人优先考虑此方案而不是去解析网页。1.3 整体架构与关键取舍整个项目的架构很简单分为采集层、存储层、计算层和推送层。采集层负责定时调用 GitHub API将事件流和仓库信息拉回来存储层用一个轻量级数据库保存每日事件快照计算层跑过滤、评分、排序逻辑生成当天的趋势榜单推送层通过消息接口把结果送到我的阅读工具里。这个架构里最关键的取舍是不要试图实时处理全量事件流而是采用“定时快照 增量计算”的模式。GitHub 全站每分钟产生的事件量巨大如果按实时流处理对个人项目的运维压力太大。我用的是每 15 分钟抓取一次增量事件聚合后写入数据库每天固定时间做一次全量计算。这样既保证了数据的粒度又把 API 消耗控制在可接受范围内。另外我还有个小原则宁可少收录一个仓库也不要错收一个没有营养的仓库。所以在过滤规则上下了比较重的功夫这一点后面单独展开。2. 趋势数据的抓取与解析2.1 基础接口与参数细节涉及的核心接口主要有两个。第一个是事件流接口拉取全站公开事件数据。它的地址和方式是标准的 REST 风格支持分页。每页最多返回 100 条事件记录默认按时间倒序排列。第二个是仓库详情接口用来获取仓库的元信息。需要注意这个接口的返回字段里有一个stargazers_count它是仓库的当前总 Star 数不是当日新增。当日新增必须靠事件流里 WatchEvent 的数量来统计。我采集事件流的初始实现是这样的import requests import time def fetch_events(page1): url https://api.github.com/events headers { Accept: application/vnd.githubjson, Authorization: Bearer YOUR_TOKEN } params {per_page: 100, page: page} resp requests.get(url, headersheaders, paramsparams) resp.raise_for_status() return resp.json()这段代码每一轮最多拿到 100 条事件要拿到足够覆盖 15 分钟窗口的事件量通常需要翻很多页。这里有个重要的细节GitHub 的事件流接口有事件类型过滤参数可以把输出限制在watch事件类型这样大幅减少数据量GET /events?per_page100typewatch但实际测试下来这个过滤参数并不能完全保证只返回 watch 类型所以稳妥的做法还是拉全量后本地过滤。我在本地做了一层白名单事件类型判断只保留WatchEvent避免把 fork、issue 操作误计为 star 增长。2.2 排序维度与过滤规则拿到了事件流之后最核心的问题是哪些事件应该被记入某个仓库的“今日增长”我遇到过不少坑。比如同一个用户对同一个仓库连续多次 watch事件流里会对应多条 WatchEvent 记录。按常理推算一个用户对一个仓库只会 star 一次GitHub 的 watch 操作本身是幂等的但 Event API 里仍然可能出现重复事件。我在聚合时以actor.id repo.id做去重确保同一个用户对同一仓库的多次事件只算一次。再比如有一些仓库因为教程或营销活动集中涌入大量新用户短时间内的 WatchEvent 数量爆炸式增长。这些仓库确实上了当日趋势榜但长期看并没有真实的技术热度。我的过滤规则会单独计算这个仓库历史 star 的总量和近期增速如果增长率超过某个异常阈值就把它的排序权重下调。具体的评分计算我这里先卖个关子放到下一节细讲。但过滤规则的思路可以透露先按语言分组再按当日新增 Star 排序最后剔除满足以下任意条件的仓库描述为空、没有 README 的仓库明显是收集类、期刊类的聚合仓库fork 数量远大于原始 Star 数量的仓库短期新增 Star 超过历史总数 500% 以上的仓库第一条规则特别好理解一个仓库如果连 README 都舍不得写它的爆火大概率不是技术原因。2.3 时区与更新时间窗的处理GitHub 的事件流时间戳是 UTC 时间很多人在这里栽过跟头。如果直接用事件流里的时间戳做“今天”的统计会发现榜单每天切割的边界和本地时间完全对不上尤其在凌晨的局部时段。我的方案是所有计算统一使用 UTC最后在推送层再做一次本地时区转换。也就是说数据库里存的事件时间全部是 UTC 的 ISO 字符串计算趋势窗口时以 UTC 当天零点为边界。比如要计算“今日趋势”就是从当前 UTC 时间往前推 24 小时而不是简单地取“今天 0 点到现在”。这样处理的好处是多天数据和跨时区对比时不会乱。另外还有一个细节GitHub 的趋势算法里多数仓库是在美西时间的白天获得高峰关注对应到 UTC 就是下午到深夜。如果想捕捉“日榜”峰值建议把每日计算时间设在 UTC 时间上午这样可以覆盖美西时段一整天的数据变化。3. 榜单生成与内容编排3.1 加权评分的计算逻辑纯粹的 Star 增长数排名有一个天然缺陷它有利于拥有庞大用户基数的老牌仓库不利于真正耀眼的新兴项目。一个有一万 Star 的仓库新增 500 个 Star和一个只有 50 个 Star 的仓库新增 500 个 Star显然后者的增长势头更猛。所以我的榜单没有用绝对增长量排序而是引入了一个加权评分模型融合了绝对增长量、相对增长率和仓库历史声望三个因子。公式大致是score log(1 today_stars) * 0.4 log(1 today_stars / (base_stars 10)) * 0.4 log(1 base_stars / 1000) * 0.2其中base_stars是统计窗口开始前的仓库 Star 总数。这个公式的核心思路是绝对增长量反映热度规模相对增长率反映爆发力历史声望反映仓库的基本盘。三者取对数是为了压缩数量级差异避免一个 10 万 Star 的仓库凭借微小的绝对增量碾压全场。实践中这个公式跑出来的榜单非常接近我人工筛选时的主观判断但又不完全一致经常能发现一些我原本没注意到的小众优质项目。这也是自动化速递最让我惊喜的地方——它帮我拓宽了视野。3.2 去重与排除规则榜单生成后还面临一个数据净化问题。某个明星语言的热门仓库可能连续一周霸榜如果每天推送的内容都是同一个仓库读者的信息收益会急剧下降。我在去重方面做了两层规则。第一层是时间维度去重同一个仓库如果在过去 3 天内连续出现在日榜中第二天的推送里降低它的排位并加一个“连续上榜”的标签如果在过去 7 天里出现超过 4 天则进入“冷却期”暂时不出现在默认榜单中除非它的增长量再创新高。第二层是语义维度去重把仓库名、描述做归一化处理对明显相似的项目进行合并。比如某个工具库出了一个新的封装版本或者某个项目被迁移到新的组织账号下这些都会被识别并归并为一条信息避免榜单内容重复。排除规则的最后一环是维护一个黑名单库。我会定期把那些通过刷 Star、悬赏推广、碰瓷热门项目等手段炒起来的仓库加入黑名单。这个库是长期积累的目前规模不大但有效性非常高。3.3 生成“速递”内容的模板计算完成之后每天会生成一份完整的数据报告。最初我直接输出 JSON 格式但发现可读性太差每次都要在阅读器里费劲地展开结构。后来自定义了一套推送文案模板效果好了很多。推送的核心部分是每一条仓库的“一句话推荐”。这句话不是从描述里截取的而是我设计的一个模板组合仓库名称 核心用途 技术栈 增长亮点。例如项目名 / 语言名 —— 一句话描述。24小时新增 240 Star相对增幅 320%连续上榜 2 天。这个模板看起来简单但一开始“一句话描述”部分怎么自动化折腾了很久。最开始直接取 README 的第一句话结果 README 开头往往是项目徽标、安装命令、链接集合根本不能作为一句话概括。后来我改用 GitHub Topic 和description字段的组合先将description截断到 80 个字符再追加前三个 topic 标签效果明显好很多。4. 自动化发布与部署4.1 定时任务与运行环境整个项目我最初跑在一台小内存的个人服务器上后来数据量增大之后迁移到了一个轻量级容器里。定时任务用的就是系统自带的 cron调度频率分成两种事件采集任务每 15 分钟执行一次榜单生成任务每天固定时间执行一次。采集任务的执行时间很短单次任务通常在 10 秒内结束但会连续翻页拉取数百页事件数据。这里有几个容易踩的坑cron 任务必须设置超时和重试机制防止网络抖动导致拉取中断。采集脚本要记录游标即上一轮拉到的最后一条事件时间避免重复拉取或漏拉。API Token 需要定期轮换长时间不换会被系统风控。我的 cron 配置大概是这样的放在 /etc/cron.d/trending 文件里*/15 * * * * app-user cd /opt/trending python collector.py logs/collector.log 21 30 0 * * * app-user cd /opt/trending python daily_summary.py logs/daily.log 21注意采集任务和汇总任务必须用不同的日志文件否则后续排查问题时根本分不清哪个阶段出的错。4.2 发布渠道的对接数据生成之后我最初的方案是写一个 HTML 页面部署到自己的服务器上。但独立页面的访问路径太冷门后来放弃了改为推送到即时通讯工具的 Webhook 频道。这个改动让整个项目真正达到了“每天自动送到眼前”的体验。对接 Webhook 的核心实现非常直接就是把生成的文本消息封装成特定的推送格式POST 到 webhook 地址即可。实测下来最需要注意的一点不是格式而是消息长度。有的平台单条消息有长度限制超出就直接丢弃整条消息。我当时的处理方案是如果榜单内容超过长度限制就按仓库分成多条发送每条作为一个独立的卡片。这样做一方面避开了长度限制另一方面每条只描述一个仓库阅读负担降低了很多。还有一个隐藏好处卡片支持点击跳转到仓库主页比纯文本方便太多。4.3 资源占用与成本控制个人跑这种定时抓取项目最怕的就是服务器资源被吃光。GitHub 事件流的原始数据量和仓库详情接口的调用频率是资源消耗的大头。我做了一个限速控制所有 API 调用都通过一个信号量统一管理保证并发数不超过 3单接口每秒不超过 2 次请求。虽然拉取速度慢了一些但非常稳定基本不会触发限流惩罚。存储方面用的是轻量级的嵌入式数据库单个文件承载全部历史数据。数据量方面的控制方法是定期清理超过 90 天的事件明细只保留聚合后的日汇总数据。因为排行榜计算每天都要重跑一遍原始明细的时效性只有近期才有意义留太多纯粹浪费磁盘。还有一个容易忽略的成本点GitHub 的 API Token 有免费额度和付费额度之分。个人项目用好免费额度完全足够我实测下来每天大约消耗 2000 次左右请求距离免费配额上限还远得很。反倒是如果用了某些第三方平台的高频实时接口账单才是止不住的上涨。所以我强烈建议项目尽量直面 API 原生的数据源不要套太多中间层。5. 实战踩坑与故障排查实录5.1 API 限流的应对做这个项目期间我至少被 GitHub 的限流机制制裁过三回。第一次是事件流拉取页数太多触发了速率限制第二次是在事件采集完成后立刻去拉仓库详情导致短时间内请求量陡增第三次是排查问题时手滑写了个死循环疯狂请求接口。应对限流的经验很简单不要对抗速率限制而是主动避让。每次请求前检查返回头里的X-RateLimit-Remaining字段当剩余次数低于 100 时直接休眠 1 分钟后再继续。这个策略看起来很怂但实测下来整个采集周期虽然拉长了却一次都不会触碰到硬限流。另外一个特别值得分享的点是不要对同一个接口连续使用分页拉取超过 10 页。如果事件流数量巨大10 页还拿不完说明这个窗口的事件量异常与其硬啃不如跳过这个窗口等下一轮补采。及时止损比追求完整性重要得多。5.2 数据异常与误报处理有一段时间榜单上频繁出现一个奇怪的仓库描述写着“xxx 大全”Star 增速惊人但点进去发现内容完全是空壳。后来排查下来才知道这个仓库的作者把内容维护在一个私有仓库里公开仓库只放了 README 的引流链接。这种仓库纯粹是为了蹭榜单流量没有任何技术价值。我当时的处理方式是加入人工审核机制每天榜单生成后速递推送前我会快速浏览前二十名的仓库名称。一旦发现可疑项目立即手动加入黑名单并且在当日榜单中将其剔除。这种方式不能做到 100% 防漏但长期维护效率很高。后来我还写了一个简单的启发式规则自动识别“README 只有一张图片或一个外链”的仓库进一步压缩误报率。5.3 榜单“水化”与长期质量维护这是我认为整个项目里最值得聊的坑。运行几个月之后你一定会发现趋势榜渐渐被几个固定的大语言模型相关项目、Web 框架项目霸占。不是说这些项目不好而是长期看信息熵太低每天都是熟悉的面孔速递就失去了“发现新大陆”的意义。我最后采用的方案是动态热度分层把仓库按基础 Star 数分成三档每档单独出一个子榜单最终推送时按比例混合呈现。小体量仓库的机会更多老牌仓库也不会完全被挤掉。这样既保证了内容的典型性又保留了对新项目的敏感度。从项目立项到现在我个人最大的体会是做信息类自动化项目真正困难的部分并不是写代码而是持续维护数据质量。GitHub 上每天都有新仓库诞生热度暗流涌动一个算法不可能一劳永逸地适用所有情况。定期回头审视评分公式里的权重清理黑名单调整过滤阈值这些看起来琐碎的工作才是一个趋势速递项目的护城河。如果你也打算做类似的东西我的建议是先跑通最简单的版本哪怕只是每天把官方 Trending 页面截图存下来也比完全不记录强。等积累足够多的历史数据之后你会对技术社区的热点迁移有完全不一样的理解。

相关新闻

Altium Designer 23安装部署全流程:环境准备、授权配置与常见问题排查

Altium Designer 23安装部署全流程:环境准备、授权配置与常见问题排查

1. 为什么还要聊AD23的安装这件事搞硬件设计的,没人绕得开EDA工具。Altium Designer(后面统一叫AD)在国内硬件圈子的普及率,说句不夸张的话,十个画板的至少有六七个用过它。AD23是Altium公司2023年推出的版本&#xff…

2026/10/10 10:14:54 阅读更多 →
Impeccable实践:构建代码规范、测试与持续集成的工程质量体系

Impeccable实践:构建代码规范、测试与持续集成的工程质量体系

我一直觉得,“impeccable”这个词比“perfect”更贴近工程现实。perfect 听起来像是一个静止的终点,而 impeccable 更像是一种状态:哪怕很小的细节,也经得起检查。我给自己的一套开发实践起了这个名字,不是为了追时髦&…

2026/10/10 10:14:54 阅读更多 →
跨平台移植存储适配指南:避开路径、权限与数据安全暗坑

跨平台移植存储适配指南:避开路径、权限与数据安全暗坑

跨平台移植这件事,凡是亲手做过的人都清楚:编译期的报错是明坑,编译器会拿着错误清单一点一点逼你改;运行期的坑才是暗坑,明明编译全部通过,程序也能正常启动,可关键功能一触发就出现各种匪夷所…

2026/10/10 10:14:54 阅读更多 →

最新新闻

Windows下OSGeo4W安装PDAL避坑指南:从环境配置到LAZ v1.4实测

Windows下OSGeo4W安装PDAL避坑指南:从环境配置到LAZ v1.4实测

简介:本资源是面向GIS开发者、遥感工程师及三维点云处理从业者的PDAL库离线安装包,专为解决Windows环境下因网络限制导致OSGeo4W官网下载PDAL失败或缓慢的痛点。压缩包完整封装了OSGeo4W64 64位安装环境及PDAL核心组件,并预集成CloudCompare兼…

2026/10/10 14:51:56 阅读更多 →
Go接口底层原理详解:方法集、动态类型与类型断言

Go接口底层原理详解:方法集、动态类型与类型断言

1. 从一道题说起:接口到底“存”的是什么先抛个问题:下面这段代码,你觉得var s Sayer &Dog{}和var s Sayer Dog{}有什么区别?哪个能编译通过?type Sayer interface {Speak() }type Dog struct{}func (d Dog) Spe…

2026/10/10 14:51:56 阅读更多 →
音频滤波器设计与仿真:从基础参数到实战应用指南

音频滤波器设计与仿真:从基础参数到实战应用指南

我处理过不少音频项目,每次遇到低频嗡嗡声、人声发闷、分频衔接不自然这类问题,最后都会回到同一个工具上:滤波器设计与仿真。它看起来只是信号处理的一门基础课,真正在音频处理里用起来,门槛全藏在细节里——参数怎么…

2026/10/10 14:51:56 阅读更多 →
Windows上Oracle 12c安装指南:从环境检查到静默部署避坑实践

Windows上Oracle 12c安装指南:从环境检查到静默部署避坑实践

简介:这是一份针对Windows x86-64平台的Oracle 12c数据库安装资源,版本对应12.2.0.1.0,补丁编号P33174380,主要用于帮助DBA和运维人员在Windows环境下一站式完成数据库核心、集群及存储组件的部署。资源包共2000个文件&#xff0c…

2026/10/10 14:51:56 阅读更多 →
仅812MB的桌面Linux发行版MiniOS:让老电脑重获新生的U盘系统实测

仅812MB的桌面Linux发行版MiniOS:让老电脑重获新生的U盘系统实测

第一次看到MiniOS镜像体积时,我下意识以为这是一个精简版维护工具盘,而不是一个能日常使用的桌面Linux发行版。812MB,这个数字在今天是个什么概念?一部高清电影的体积是它的两倍还多,一张老CD光盘是700MB,也…

2026/10/10 14:51:56 阅读更多 →
振动分析:预测性维护

振动分析:预测性维护

多年前在一家水泥厂的巡检通道上,老师傅掏出一根螺丝刀,把刀尖顶在风机轴承座外壳上,另一头贴着耳朵听。他说这个声音比上周"毛"了一点。三个月后那台风机换了轴承。这套判断很准,但只长在少数人身上——人一退休&#…

2026/10/10 14:50:55 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →