
这是一个示例博客、文章数量、主机数量及下方的结果均为假设。在制定任何计划之前,请将每个数字替换为你自己的实际数据。
设置
假设有一个包含 200 篇文章的博客。对自己网站的抓取列出了 1,150 个出站链接,在去除重复项和自身域名后,这些链接指向约 410 个唯一主机。
对 410 个主机进行手动 Ahrefs 免费外链检测需要一下午的粘贴操作,令人头疼,因此计划是编写脚本。分三个阶段完成工作:评估主机、检查问题主机,然后检查博客本身。
预计整个运行过程(从导出到清理后的归档)可以在一名编辑和一名开发人员的工作周内完成。然后计划进行第二轮检查。
你归档中的数量会有所不同。在将任何数字复制到计划之前,请替换为你自己的导出数据。这里的每个数字仅展示工作的规模。
使导出步骤可重复
导出决定了后续运行是否可信。三个习惯可确保数据准确,且在第一次调用之前设置这些习惯成本很低。
渲染后的 HTML,而非 Markdown
从渲染后的页面(访客看到的页面)导出链接。Markdown 会遗漏短代码、嵌入内容以及插件插入的任何内容。大多数缺失的链接就隐藏在这些差异中。
每篇文章一行
每篇文章写一行,包含文章 URL、主机和导出日期。单一的扁平列表很难检查。按文章分行的列表允许你重新运行单篇文章,而不影响其余部分。
保持列名简洁稳定,以便后续脚本以相同方式读取本月和下月的文件。
记录导出时的抓取日期。上个月构建的列表和今天构建的列表可能存在差异,审计应显示使用的是哪一个。
首先去除自身域名
移除自身域名和每篇文章都链接到的社交主机。否则,你的页脚链接会占据评分列表的顶部,掩盖真正的问题。

工作排序
200 篇文章的扫描不需要一次性完成。但需要有顺序,以便最先获得最有用的修复。
从仍有访问量的文章开始
按 Search Console 中仍有点击的文章对归档进行排序。死文章上的断链损失很小。读者仍在访问的页面上的断链会损害信任,因此从第二类文章开始。
Search Console 告诉你哪些 URL 仍有点击。它不告诉你这些页面的出站链接中哪些是断链,因此这两个来源各司其职。
先解决成本最低的问题
停放域名和死主机通常只需一次编辑即可修复。在解决更复杂的问题之前先清除它们,这样列表会缩小,其余工作可以在一天内完成。
将判断性决策留到最后
仅仅是薄弱的引用(例如一个说真话的小博客)需要人工判断。将它们放入单独的堆中,由编辑决定,而不是依靠阈值。
为每个决策写一行备注。六个月后,这些备注可以避免重复同样的争论。
其中一些情况最终会没问题。第一次扫描时看起来内容稀少的页面可能是一篇简短且正确的文章,编辑可以在一分钟内关闭该文件。
分阶段进行
01一次调用评估所有 410 个主机
bulk_dr 最多接受 2,000 个域名,因此一次 1 积分的调用即可完成。按评分列升序排序。
02检查最低评分部分
假设有 38 个主机的评分为 0 或 1。手动打开每个被引用的页面;大多数是死站点或停放域名。计划每 10 页花费 20 分钟。
03获取博客自身的外链数据
你域名的 refdomains 和 anchors 各需 2 积分,共 4 积分。将锚文本与你担心的文章进行比较。
04修复,然后记录
替换或删除不良引用,在审计日志中记录日期和消耗的积分。
在信任批次之前进行验证
扫描可以干净地结束,但结果仍可能是错误的。三个检查可以发现大部分错误。保持它们足够简单,以便在 shell 脚本中运行,并将它们放入作业中,而不是依赖某人的记忆。
检查每个回复中的 ok 状态
ok 设置为 false 的回复不是数据。在运行过程中计算失败次数,当失败率超过你在开始前设定的较小比例时,停止扫描。
如果扫描在该行停止,记录停止的位置及原因。下一次运行可以从该点恢复,而不是重新开始并支付两次费用。
将行数与输入进行对比
比较发送的主机数量与返回的主机数量。不匹配意味着拼写错误、重复项或静默丢弃,每种情况都需要在日志中记录一行。
保留原始 JSON
将每个响应按日期和输入列表保存。如果三个月后某个评分看起来不正确,原始文件比重新调用能更快地回答问题。
此假设运行的账单
| 调用 | 积分 | 美元 |
|---|
410 个主机的 bulk_dr | 1 | $0.0001 |
|---|
博客的 refdomains | 2 | $0.0002 |
|---|
博客的 anchors | 2 | $0.0002 |
|---|
| 总计 | 5 | $0.0005 |
|---|

阅读结果而不自欺欺人
零分是否意味着死站点?不一定。
在我们的索引中没有引用域的主机可能是一个非常新的站点、私有内网页面或真正的停放域名,只有人工才能区分。将评分列视为注意力的排序键,而不是自行决定结果的分数。
将评分列与锚文本一起阅读。多样化锚文本配置文件旁边的低评分与一堆相同锚文本旁边的低评分含义不同,需要不同的后续操作。
两次扫描之间变化的评分也是有用的信息。检查是主机发生了变化,还是只是索引发生了变化。
什么会让你感到惊讶
成本通常不是这里的限制因素。
时间花在读 38 页并决定每页如何处理上,没有 API 能消除这一步。计划一名编辑的工作日。我们的数据大约每月刷新一次,因此看起来为空的主机可能只是新加入索引。
另一个惊喜是一个站点经常以两种拼写形式出现。裸域名和带 www 的版本在合并之前是单独的行,看起来较高的计数通常只是这种加倍造成的。
为了在之后保持归档整洁,将 发布前外链决策树 放在新文章之前,并安排 月度审计。成本表 列出了每个操作的价格。
关于运行扫描的问题
几乎每次扫描都会出现四个问题,在第一次调用之前解决它们比之后解决更容易。
我可以用 Ahrefs 免费外链检测代替吗?
在这个规模下不行。免费网页检查器是为一次检查一个域名而设计的,因此 410 个主机意味着 410 次手动查找。使用脚本进行一次批量调用是更实用的方法。
我需要分页查看所有结果吗?
仅针对付费列表。批量评分一次调用即可获取主机列表,而 refdomains 和 anchors 返回分页结果。使用 page 和 per 参数,per 最大为 5000,并在达到 50,000 行的深度分页限制时停止。
我应该使用哪种排序顺序?
按你关心的字段进行 sort,然后设置 order 为 asc 或 desc。为了寻找薄弱主机,按评分升序排列可以将最差的結果排在前面。
如果主机有评分但页面已消失怎么办?
评分描述的是我们索引中的链接,而不是页面是否仍可加载。检查页面本身,因为索引刷新可能会滞后于已经消失的页面。
一次扫描就足够了吗?
通常不够。运行一次以清理归档,然后在新的文章上启用 gate,并每月重复审计,因为索引大约每月刷新一次。
在开始自己的扫描之前
- 从渲染后的 HTML 导出出站链接,而不是 Markdown。
- 首先去除自身域名和常见的社交主机。
- 将每次响应的原始 JSON 按日期保存。
- 在查看结果之前写下底线。
- 预算编辑时间,而不是积分。
同一示例的变体
规模变化,方法不变。
小型博客可以跳过批量步骤,通过一次手动调用运行整个列表。方法保持不变,只是工具发生了变化。
拥有 2,000 篇文章的博客可能有 3,000 个唯一主机,这仍然可以通过两次 bulk_dr 调用完成,每次 1 积分。拥有十个博客的网络重复该计划十次,成本约为五分钱,因此预算从不决定项目。决定项目的是审查时间。
注意渲染步骤。在 WordPress 上,通过 REST API 导出渲染后的 HTML;在 Hugo 或 Eleventy 上,读取构建文件夹,因为输出已经包含访客将看到的每个链接。Ghost 站点可以使用 Content API 完成相同的工作。
如果仍有删除的页面,也请导出它们。它们的出站链接仍然算作工作量,因为访客可能会从旧搜索结果中访问它们。