外链失效实测1336条出处链接:真死链只有6条,打不开的有181条

外链失效实测1336条出处链接:真死链只有6条,打不开的有181条
张文保 20 分钟阅读 3,872 阅读
本文目录
  1. 把1336条出处链接挨个点开,会看到什么?
  2. 这批目标是怎么来的
  3. 两轮抓法有什么不同
  4. 第一轮说有253条打不开,为什么第二轮翻回来72条?
  5. 并发把被挡住和不存在算成了同一件事
  6. 两轮的状态码摆在一起看
  7. 修正后的总账
  8. 真正的死链只有六条,这跟直觉差多少?
  9. 除了那6条死链,剩下的175条是被谁挡住的?
  10. 翻案的那72条来自哪里
  11. 反爬与权限墙那140条
  12. 两轮都连不上的31条
  13. 被拦这一档,对读者到底有没有影响
  14. 把三档分开有什么用
  15. 有122条链接在跳转,跳到哪儿去了?
  16. 跳到别的域名的十七条
  17. 还有两条跳成了首页
  18. 顺着链接走过去,还找不找得到被引的那个数?
  19. 配对这一步先翻了一次车
  20. 三档口径一起报
  21. 匹配这一层也要放宽三次
  22. 找不到的那二十条,分五种情况
  23. 锚文本能不能替你说清楚要去哪儿?
  24. 出处链接该怎么检查
  25. 第零件:先确认自己在测什么
  26. 第一件:把测量口径先定死
  27. 第二件:只查举证位置上的链接
  28. 第三件:走过去确认那个数还在
  29. 顺带看一眼:这些目标页自己引不引别人
  30. 把这三层放在一起,能得出什么
  31. 这份实测的边界在哪儿
  32. 常见问题解答
  33. 把这套检查接进日常,成本有多大?
  34. 为什么第一轮和第二轮差这么多,是不是并发就不能用?
  35. 返403的链接要不要换掉?
  36. 死链率只有0.4%,是不是说明不用管链接腐烂?
  37. 跳到别的域名,要不要把链接更新成新地址?
  38. 怎么判断一个数字在目标页上是找不到还是我没找对?
  39. 付费墙后面的数据能不能当出处?
  40. 这套检查值得做成自动化吗?
  41. 权威参考资料

摘要:把242篇英文内容页正文里引出去的1336条去重链接挨个点开。第一轮八线程并发报出253条打不开,换成单线程加完整浏览器请求头重测,其中72条当场翻案。修正后:能取回正文的1155条占86.5%,真正的404与410只有6条占0.4%,被反爬或权限墙挡住的140条占10.5%,两轮都连不上的31条占2.3%。另有122条在跳转,17条跳到了别的域名。顺着链接走过去,被引的那个数在目标页里找不到的占13.3%。

出处给了,链接也在,读者点下去会发生什么。这件事听上去不需要测——链接嘛,不是通就是不通。真跑一遍才发现,通与不通之间隔着好几层,而每一层的成因完全不同,能采取的动作也完全不同。

这一轮把1336条出处链接逐条点开,记下状态码、跳转链、最终落点,再打开目标页找一遍被引的那个数字。

把1336条出处链接挨个点开,会看到什么?

这批目标是怎么来的

来源是242篇英文搜索营销内容页的正文,把其中所有指向站外的链接抽出来去重,得到1263条指向第三方的、73条指向同行内容站的,合计1336条。这批链接的年龄普遍不大,文章本身都是近三个月发的,所以下面看到的任何失效都不是时间冲刷的结果。

两轮抓法有什么不同

第一轮用8个线程并发,每个请求之间随机停0.5到1.5秒,超时30秒,只发一次。第二轮只对第一轮的非200重跑,改成单线程、完整的浏览器请求头(含Sec-Fetch与Sec-Ch-Ua那一套)、超时放到45秒、失败重试一次,并且单独做一次域名解析。

两轮的差别不是为了凑数,是为了回答一个必须先回答的问题:报出来的“打不开”,有多少是目标真的打不开,有多少是我这台机器造成的。

第一轮说有253条打不开,为什么第二轮翻回来72条?

并发把被挡住和不存在算成了同一件事

第一轮的成绩单是200共1083条占81.1%,非200共253条占18.9%。如果就这么写出去,结论会是“将近两成的出处链接是坏的”。

第二轮重测这253条,有72条直接拿到了200,翻案率28.5%。翻案的域名集中在几个平台上:某新闻通讯平台9条、视频平台9条、搜索引擎自己5条,其余分散。它们并没有坏,只是不喜欢短时间内来自同一个地址的密集请求,或者对精简的请求头不放行。

这个坑不是第一次踩。上一次是并发探测门店查找页,49个站一路返429,算出来的覆盖率整整低了15个百分点。429和403都是正常响应,脚本不会报错,它们会安安静静地进到分母的另一边。

两轮的状态码摆在一起看

状态码第一轮(8线程)第二轮(对非200单线程重测)
200108372
4038998
999(自定义反爬码)3128
40158
42944
45102
40456
连不上(超时、握手失败)11231

连不上那一栏从112降到31,降幅最大;403反而涨了9条,因为第一轮里有一批超时的目标在第二轮明确返回了403。换句话说,第一轮的112条超时里,既藏着能打开的,也藏着被拒绝的,它把两种完全不同的事实压成了同一个零。

状态码本身是有严格语义的。HTTP语义的规范文本把403定义为服务器理解请求但拒绝授权,把451定义为因法律要求不可用,两者都不表示资源不存在。410与404的区别更明确:410是明确宣告这个资源已经永久没了,404只是现在找不到。而999根本不在规范里,是某个平台自己造的。把这些码全部折叠成“坏链接”,等于把授权、法律、限流、真的不存在这四件事混成一件。

修正后的总账

结果条数占1336条
能取回正文115586.5%
被反爬或权限墙挡住14010.5%
两轮都连不上312.3%
真死链(404与410)60.4%
其他(402、500、202)40.3%

域名解析这一关一条都没坏,1336条的主机全部解析得出IP。

真正的死链只有六条,这跟直觉差多少?

0.4%。做内容的人对“引用链接会烂掉”这件事有很强的心理预期,实测下来在这个时间尺度上几乎不存在。这批文章最老的也就三个月,链接腐烂需要的是年,不是季。

那六条值得逐条看一眼,因为它们的成因不重样:一条是新闻站把三年前的报道撤了;一条是某咨询机构自己的产品页下线;一条是媒体的栏目页改版;一条是营销服务商的落地页到期;剩下两条是平台自己删掉的帮助页——一个是社交平台改名后废弃的整个商业子域,一个是另一家平台的商家入门指引

最后这两条最扎心:写文章的人引的是平台官方文档,这在任何一份评估标准里都算最强的证据,而它照样会消失,且消失得没有任何通知。修死链值不值得做这个老问题在这里有了新的答案——按数量算不值得,按位置算非常值得,因为死掉的那几条恰好落在举证位置上。

除了那6条死链,剩下的175条是被谁挡住的?

翻案的那72条来自哪里

按域名归堆,翻案最多的是一个新闻通讯平台9条、一个视频平台9条、搜索引擎自己5条,另有社区站、百科、几家社交平台各两三条。这些都不是小站,它们的共同点是流量大、防护严,对短时间内的密集请求敏感。

值得记一笔的是搜索引擎那5条。用它自己的文档地址做测试,第一轮拿到的是403,第二轮拿到200。连最该稳定的那个来源,都会因为请求方式不同给出两种答案。做任何跨站点的批量探测,这一点必须提前算进去,否则测量本身会替目标站编造出一段并不存在的行为。

反爬与权限墙那140条

175条里,被明确拒绝的140条,两轮都连不上的31条,其余4条是付费要求、服务器错误与异步受理。先看被拒绝的那140条:返403的98条、返999的28条、返401的8条、返429的4条、返451的2条。999不是标准状态码,是某个职业社交平台自定义的反爬响应;451的字面意思是因法律原因不可用。

按域名看,这140条高度集中:职业社交平台30条,一家新闻通讯站10条,两家评测与主机服务商各8条,其余是几家老牌财经与科技媒体,每家三到五条。这一档的共同点是它们都能在浏览器里正常打开,只是不欢迎程序。换句话说,读者点得开,做审计的脚本点不开。

两轮都连不上的31条

这31条的错误类型是连接超时、SSL握手失败与连接被重置,而域名解析全部正常。按域名看是另一批:某去中心化社交平台8条,社区站3条,短视频平台3条,另有几家咨询与媒体机构。

这里必须把口径说清楚:测量是在中国大陆的一台普通机器上跑的,这31条里相当一部分是网络可达性问题,不是目标站的问题。换个出口再测,数字会变。但对中文读者来说,这个数字反而更有意义——它回答的是“我点过去能不能看到”,而不是“它在理论上存不存在”。

被拦这一档,对读者到底有没有影响

大部分没有,少数有。403与999这类反爬响应只针对程序,读者用浏览器点过去完全正常。真正影响读者的是401和付费墙——样本里有几家财经媒体,链接过去看到的是前两段加一个订阅按钮,而被引的那个数往往就在后面。

这一层和robots指令有没有人读那件事有一点像:站点写下的规则和实际发生的行为是两回事。这里是反过来的版本,目标站的拒绝行为并没有写在任何一份规则里,只体现在响应码上,而且对不同来路给的还不是同一个码。

把三档分开有什么用

因为动作不一样。真死链要换链接;被反爬挡住的不用动,读者能打开;连不上的要看你的读者主要在哪个网络环境里,如果和你一样,那就等同于死链,得在正文里把关键内容摘出来。SEO爬虫报的死链和搜索引擎抓的从来不是同一批说的是同一类问题的另一面:报出来的坏链接,先问是谁在什么位置上报的。

有122条链接在跳转,跳到哪儿去了?

发生跳转的122条占9.1%,其中跳两次以上的19条。跳转本身没问题,问题在落点。

跳到别的域名的十七条

17条最终落在了和原地址不同的注册域上,占全部链接的1.3%,占跳转的13.9%。典型的三种:

  • 公司被收购或改名,老域名整体跳到新品牌,例如一家做用户行为分析的工具跳到了收购方的产品页。
  • 平台改名,老域名跳新域名,推特那一套地址现在全部落到新域名上。
  • 内容资产被并进另一个站,一个内容站的统计页现在跳到了另一家媒体的指南栏目下。

第三种最值得注意。原文引用时,那个数字属于A站;今天点过去,同一个数字挂在B站名下。引文里写的机构名和落地页上的机构名对不上,而中间没有任何提示。

还有一类是短链接。职业社交平台的短域名会先跳一次再落到帖子上,这类在样本里也有。谷歌关于重定向的文档说明搜索引擎会跟着跳转链走到最终地址,但对读者来说,多一跳就多一层不透明——鼠标悬停时看到的域名,和实际会到达的域名不是一回事。

还有两条跳成了首页

从一个具体页面跳到目标站首页的有2条。数量很少,但这是最糟的一种:状态码是200,链接检查工具全绿,读者却什么都找不到。这类要靠比对跳转前后的路径深度才能发现,跟站点地图里那些坏网址是同一种检测思路。

顺着链接走过去,还找不找得到被引的那个数?

配对这一步先翻了一次车

第一版的做法很粗:把一个块里所有的站外链接和这句话里所有的数值做笛卡尔积,得到1073个组合,逐个到目标页里找。结果是28.4%找不到,看着触目惊心。

问题在于配对本身。一个块里有两条链接、一句话里有三个数字时,会生成六个组合,其中至少四个的配对关系是错的。把口径收紧到“本块只有一条站外链接、本句只有一个数值”这种配对唯一的情况,找不到的比例从28.4%降到15.3%。差出去的十三个百分点,是我自己配错的对。

三档口径一起报

配对口径可核组合找不到比例
宽:块内全部链接乘句内全部数值107330528.4%
中:本块唯一外链乘本句首个数值1502013.3%
严:本块唯一外链且本句唯一数值981515.3%

匹配时做了三层放宽:原样比对、去掉千分位与量级词换算之后比对、只比数字串。三层都找不到才算找不到。中口径和严口径的样本量不同但结论一致,都在13%到16%之间。

匹配这一层也要放宽三次

同一个数在两个页面上的写法常常不同。文章里写1.5 million,目标页写1,500,000;文章里写7,596,581,目标页写成不带分隔符的一串;百分号有时写成percent。第一版只做原样比对,原样命中率只有22.8%,看着像是绝大多数都对不上。

加上换算与格式归一之后升到47.3%,再退一步只比数字串升到71.6%。光是数字格式这一件事,就能让同一批数据的命中率在22.8%到71.6%之间摆动。凡是做文本层面的核对,必须先把这三层写进脚本,否则量到的是格式差异不是事实差异。这跟按名字点名爬虫却对不上真实来访是同一类失误:判据认的是字面,事实长在字面之外。

找不到的那二十条,分五种情况

  • 数字在图表里或者付费墙后面,页面上只有标题和购买按钮,这类7条,全部来自付费数据订阅商与统计聚合站。
  • 链接指向的是机构或产品的介绍页,不是那份数据本身,5条。
  • 数字确实由这家机构发布过,但在同一站的另一篇里,被引的这一篇没有,3条。
  • 链接落在论文摘要页上,被引的百分比写在正文,得再下一次全文,1条。
  • 目标页里确实没有这个数,4条,其中包括一条官方博客与一条监管机构的新闻稿。

前四类严格说不算错,是链接的颗粒度不够;第五类才是真正的问题。而读者看不出这五种的区别——他只知道自己点过去没找到。把一份清单的十个数字逐条追回出处那次做的是深挖,这里做的是普查,两者的结论对得上:真正对不上的比例不高,但每一条都要花几分钟才能确认。

锚文本能不能替你说清楚要去哪儿?

这一层的结果比预想好。1597条站外链接里,只有1条是空锚文本。

锚文本形态条数占1596条
纯无信息词(here、this study、read more之类)483.0%
里面出现了目标域名的主体名70344.0%
超过8个词的长锚573.6%

最常见的单个锚文本是source,38次;紧随其后的是几家数据机构的名字。44.0%的链接在锚文本里直接写出了要去哪家,这个比例比句内挂链率高出四倍多。也就是说,作者在“说清楚去哪儿”这件事上做得比“提供一条路”本身要好。

剩下56%的锚文本用的是描述性短语,比如把结论当锚文本挂上去。这种写法对读者友好,对被单独取走的片段不友好——脱离上下文之后,那段蓝字不告诉任何人它通向谁。锚文本分布过去是从过度优化的角度看的,从可查证的角度看它是另一套判据。

出处链接该怎么检查

第零件:先确认自己在测什么

可达性这件事没有绝对答案,它是一个三元组:从哪台机器、用什么客户端、在什么时间。同一条链接,浏览器打得开、脚本打不开是常态;今天403、明天200也是常态。写检查报告时把这三项写在开头,比报一个百分比有用得多。这跟证书这类站点侧事实不一样,那些是写死在记录里的,可达性是每次请求现算的。

第一件:把测量口径先定死

单线程、完整浏览器请求头、超时不低于30秒、失败重试一次。这几条不做,测出来的坏链接里会有近三成是自己制造的。检查结果要分四档记录:真死链、被拦、连不上、通。只报一个总数没有意义,同一个地址用不同请求方法拿到的响应本来就不一样,何况换请求头。

第二件:只查举证位置上的链接

导航、推荐位、作者简介里的链接不需要进这份检查表。把范围收到和数字断言同处一块的那些,一篇长文通常只有三五条,逐条点开的成本完全可以接受。这跟按模板抽样做审计是同一个思路:先把要查的对象缩到真正重要的那一小撮。

第三件:走过去确认那个数还在

这一步没有工具能替你做,因为它需要判断“页面上这个数和文章里这个数是不是同一件事”。可以做的是把它变成一个固定动作:每篇文章发布前,随机抽两条出处链接点开,用浏览器的页内查找搜一下那个数值。抽两条,两分钟。

顺带看一眼:这些目标页自己引不引别人

取回来的1155个目标页里,有相当一部分是内容型页面,它们自己也在引别人。粗看一眼,这些页面的引用密度普遍高于引它们的那一层——付费数据订阅商的统计页会列出数据采集说明,官方博客会链回产品文档与更新日志,预印本库的摘要页下方直接挂着完整的参考文献。

这不奇怪:越靠近原始数据,举证的成本越低,因为数据就是他们自己产的。越往转述这一层走,举证越依赖链接,而链接又越容易被排版惯例挤到别处。一条信息每被转述一次,它和证据之间的距离就远一格,而每一次转述都不会记录上一次的距离。

这只是观察,没有量化,因为目标页的体裁太杂,用同一把尺子量不出可比的数。写在这里是为了说明下一轮该测什么:把同一套判据往下再推一层,看这批被引的页面自己的举证距离是多少,两层一比,就能知道信息在传递过程中到底损耗在哪一步。

把这三层放在一起,能得出什么

把可达性、跳转、回源核对三层叠起来算一笔总账:1336条出处链接里,86.5%能取回内容;在能核对的那部分里,13.3%找不到被引的那个数。两个概率相乘,一条随机挑出来的出处链接,读者能顺利完成核对的概率大约是七成半。

这个数比它看上去要好。真正的坏消息不在这里,在上一层——大多数数字根本没有链接可点,能走到这一步的本来就是少数。可达性做得再好,也只服务于那9.6%已经挂上了链接的数字。

所以优先级很清楚:先把关键数字挂上链接,再谈链接通不通。反过来做,等于花力气去优化一条极少有人走的路。这跟孤岛页面那类问题的排序逻辑一样,先看有没有入口,再看入口好不好用。

这份实测的边界在哪儿

四条。第一,测量点在中国大陆,连不上那一档带着明显的地域色彩,换个出口重跑会变小。第二,只用程序抓,没有跑真实浏览器,凡是靠脚本渲染出正文的目标页会被判成找不到那个数,这一类在样本里比例很低但不是零。第三,链接年龄普遍在三个月内,得出的0.4%死链率不能外推到几年前的存量内容。第四,回源核对只覆盖了配对唯一的那一小部分组合,样本量分别是150与98,属于探索性结论。

再说一件相关的事。这次没有测的是响应头层面的东西,比如目标页有没有加noindex、是不是把爬虫和浏览器区别对待。爬虫黑名单里点名的那些令牌大多没真来过说明这一层的实际执行情况相当混乱,值得单独做一轮。

保哥去年给一个做宠物用品的独立站做内容体检时用过这套四档分法。他们内容团队自己跑的链接检查报告显示有37条外链失效,看着挺吓人。按四档重跑之后,真死链2条,被反爬挡住的21条,连不上的11条,其余是超时误报。真正需要动手的只有2条,其余34条改的是检查脚本,不是文章。那份报告原本已经排进了两周的工期。

还有一件顺带量到的事:这1336条链接里,有14%是同一个页面内重复出现的同一个网址。做可达性检查时如果不先按“页面加网址”去重,一条坏链接会被报很多次,而报表上看起来像是很多条坏链接。链接分析工具默认按出现次数统计,这一步得自己补。

常见问题解答

把这套检查接进日常,成本有多大?

按这次的耗时估:1336条链接并发跑完约二十分钟,非200的253条单线程复测再二十分钟,回源核对那一步因为需要人判断,一百多个组合花了两个多小时。前两步完全可以挂在每月一次的定时任务上,第三步只在关键文章上做。

更省事的做法是把它拆到发布环节:新文章上线前,作者自己点开举证位置上的那三五条链接,用页内查找搜一次数值。这一步花两分钟,能拦住的正是第五类那种目标页里根本没有这个数的情况,而这类是事后最难查、影响最大的。同一个指标传出七个数字那件事,起点就是有人没做这两分钟。

为什么第一轮和第二轮差这么多,是不是并发就不能用?

能用,但并发的结果只能当初筛。正确的流程是并发跑一遍拿到候选,再对所有非200单线程复测一遍。复测的成本不高,本次253条跑完不到二十分钟,却把结论从18.9%改到了13.5%。

返403的链接要不要换掉?

不要。403的绝大多数是反爬策略,读者用浏览器打开完全正常。判断方法很简单:自己在浏览器里点一下。脚本报403而浏览器能开,说明这条链接是好的,问题在检查工具那一边。

死链率只有0.4%,是不是说明不用管链接腐烂?

不是。这批链接最老才三个月,测的是新内容的即时可达性。链接腐烂是以年为单位发生的,存量内容里的比例会高得多。这个数字的正确用法是:新发内容的链接失效基本可以不查,三年以上的存量内容值得单独扫一遍。

跳到别的域名,要不要把链接更新成新地址?

要,尤其是引文里写了机构名的时候。跳转是可用的,但引文里的机构名和落地页上的机构名对不上,会让读者以为你引错了。更新链接的同时,正文里的机构名也要跟着改。

怎么判断一个数字在目标页上是找不到还是我没找对?

先用页内查找搜原样的字符串,找不到再去掉千分位、把million这类量级词展开再搜一次,还找不到就只搜数字部分。三步都没有,再考虑它是不是在图表里、在PDF里,或者在同一站的另一篇上。这三步覆盖了本次实测里绝大多数的疑似不匹配。

付费墙后面的数据能不能当出处?

能,但要在正文里把关键信息补齐:数值、口径、观测时间。读者点过去看不到具体数字的时候,正文里的这三样就是他能拿到的全部。

这套检查值得做成自动化吗?

前两步值得,第三步不值得。状态码分档与跳转追踪完全可以脚本化,而“目标页上这个数和文章里这个数是不是同一件事”需要人来判断,勉强自动化只会制造大量假警报。

权威参考资料

分享到
标签
版权声明

本文标题:《外链失效实测1336条出处链接:真死链只有6条,打不开的有181条》

本文链接:https://zhangwenbao.com/citation-link-reachability-audit.html

版权声明:本文原创,转载与引用请注明作者与原文链接。许可协议: CC BY 4.0

继续阅读
发表评论
分享到微信 或在下方手动填写
支持 Ctrl + Enter 提交