一、两个人每天要交三十个选题
内容团队当时只有两个运营,老板的要求是每天早上九点前交三十个可写的选题,覆盖八个内容平台。他们原来的做法是挨个打开平台的热榜页面,把前五十条抄进表格,再凭印象圈出今天能写的。整个过程大概要七十分钟,八点前必须起床开电脑,谁请假谁这天的选题就断档,剩下的那个人得连轴看完八个榜单。
抄完还不算完。同一件事往往被五六个平台同时顶上来,标题写得各有各的花样,两个人对着表格挑半天,最后交上去的三十条里还是有重复的。更要命的是热榜的时效,上午十点抄下来的条目,到下午三点就有一半从榜单上消失了,选题还没写完,热点已经凉了。
二、为什么直接抓页面这条路走不通
最省事的想法是写个脚本把页面拉下来,正则抠出标题和热度。真做起来才发现每个平台的口径都不一样,有的榜单给的是纯数字热度,有的给的是一个表示等级的汉字标签,有的干脆只给排名。时间字段也很麻烦,一部分平台只写相对时间,比如三小时前,还有的连相对时间都不给,得靠抓取时刻自己补。
去重也不能靠标题相等。同一个事件在不同平台上的措辞完全不同,一条写的是地名加事件,另一条写的是当事人加结果,字面对不上但内容是一回事。反过来,如果只做很松的模糊匹配,又会把两条都提到同一个地名但根本不相干的内容合并掉。我们试过按关键词交集判断,结果是把一个县的两次不同事故并成了一条,选题会上被当场指出来。
三、两条路子和我们要付的代价
第一条路是每个平台写一套采集脚本,采集、去重、选题各写一遍,一天就能跑起来。代价是每加一个平台就多一份重复代码,去重标准也在各套脚本里慢慢跑偏,半年后没人敢动。第二条路是做统一采集骨架,平台差异全部收进配置文件,采集结果先进归一化层,再做指纹去重和聚类选题,前期要多花两周定义统一模型。
我们选了第二条,把新平台接入的成本压到只写一份配置加一个选择器。代价是冷启动期间选题质量一般,因为聚类阈值还没调准,前两周生成的选题里有三成需要人工砍掉。两周之后人工干预率降到一成以下,这个数字是后面每周回看一次调下来的。
四、采集和选题链路是怎么串起来的
采集骨架分成调度、抓取、解析、归一化四块。调度器按平台配置的间隔触发,短视频平台和图文平台十五分钟一次,问答平台半小时一次;抓取层统一走请求封装,带上随机化的请求间隔和失败退避;解析层对每个平台挂多套选择器;归一化层把结果压成同一张表。整套代码里没有任何一个平台的名字出现在业务逻辑里,只有配置里出现。
归一化之后的表交给去重和聚类。去重先算标题指纹,汉明距离在阈值以内的算同一条,只在热度较高的那条上留主记录,其余挂成它的来源。聚类用标题里的关键词共现做粗聚类,同一簇再套模板生成候选选题,例如把事件词、主体词、结论词拼成一句待写的话。最后交给模型润色标题,热榜调度挂在 AI智能媒体助理 上,从采集到出选题的平均耗时是四十秒一轮。
生成的选题不是终点。每条选题带发布状态和写手指派,被采用的那条会回写它来自哪个平台、原始排名多少。这样一周之后就能回头算,哪些平台的哪些位置真正被写手用上了,下一轮采集的优先级就照这个调整,冷门栏目直接被降频。
五、几个关键字段和参数
归一化表一共八个字段,来源标识、榜单编码、原始排名、标题、热度原始值、热度归一值、抓取时间、内容摘要。热度归一值把各平台口径拉齐,做法是按排名映射成百分制,第一名一百分,第五十名记十分,中间按排名线性插值,这样跨平台的排序才有可比性。抓取时间一律存毫秒整数,便于算时效衰减。
去重用的是六十四位指纹,标题先做全半角统一、去标点、去空白,再分词,然后按词权重算出指纹,汉明距离小于等于三判为同一条。抓取侧的重试策略是失败三次,退避间隔取两秒、八秒、三十秒,三次都失败就跳过本轮并在监控里记一笔。热榜明细保留三十天,超过三十天按天聚合成留存统计,原始条目直接删掉。
六、踩过的三个坑
第一个坑是抓取频率。现象是某个平台连续两天返回空结果,抓取任务本身不报错。根因是我们把间隔设成了三分钟,触发了对方的风控,请求被静默降级成空页面。改法是把间隔拉到十五分钟,并且给每个平台单独配一个令牌桶限速,同时把返回条目为零当成异常事件告警,而不是当成正常的空榜单。
第二个坑是页面结构调整。现象是解析量从每轮五十条掉到零,日志里没有任何异常。根因是平台把列表容器的类名换了一次,我们的单套选择器直接失效。改法是每个平台挂主备两套选择器,主选择器取不到再退到备用,两套都取不到就置零并告警,告警里带上页面快照,第二天靠快照定位结构变化。
第三个坑是热榜的周期。现象是选题列表里总是混进三天前的旧事,写手写完发出去发现早就过时了。根因是明细表从不清理,查询也没按时间过滤,越跑越慢还越来越脏。改法是明细保留三十天做归档,选题只从最近二十四小时的条目里生成,并且按抓取时间做衰减加权,越新的条目在候选排序里越靠前。
七、这套东西管不到的地方
指纹去重解决的是字面相近的问题,跨平台语义相同但表述差异极大的内容,它照样会漏。比如一条讲的是某地暴雨导致道路中断,另一条讲的是同一场雨里某辆车被困,标题几乎不重叠,指纹对不上,只能落在同一个聚类簇里由人工合并。这类合并我们没敢全自动化,阈值松了会把不相干的内容缝在一起,代价比多留几条重复更大。
选题质量也不由这条链路决定。聚类只能告诉我们大家在看什么,模板只能把词拼成一句通顺的话,模型只能把句子润色得像人写的。一个选题能不能写出东西,取决于写手的角度和手速,系统最多把热点送到他面前。我们试过按历史点击反推选题,效果并不稳定,同一类题目在不同周的反馈差别很大。
八、小结
这套链路真正解决的问题,是把两个人早上七十分钟的手工活压成一轮四十秒的自动任务,并且把去重标准从记忆里搬到代码里。采集间隔、指纹距离、归档天数这些参数都是在实际跑的过程中,一条一条撞出来的,没有哪一个是拍脑袋定下来的。这些采集频率、阈值和归档策略,后来都成了 AI智能媒体助理 里新平台的默认配置,接一个新榜单只要照抄一份配置文件,改三处参数就能跑。