本文约 3,156 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:别人的死链,是你的机会
每个维护了三年以上的资源页,都会积累一批 404 链接。对站长来说这是维护负担,对你来说是现成的机会——那个位置已经被证明「值得放一个链接」,缺的只是一个能打开的目标。断链重建的转化率通常高于冷邮件求链接,因为你不是索取,而是在帮对方修一个 bug。难点在三个环节:去哪里找到这些死链、用什么内容去替代、怎么开口。
原理分析:为什么断链重建有效
资源页的链接是编辑选择的结果,说明该主题下这个位置有价值。链接失效意味着两件事同时发生:访客体验受损、页面维护者知道有问题但没时间修。你的介入同时解决了这两点,所以回复率天然更高。
需要区分两类死链机会:
| 类型 | 定义 | 难度 | 转化率 |
|---|---|---|---|
| 真死链 | 目标 URL 返回 404/410 或域名已过期 | 低 | 高 |
| 软死链 | 返回 200 但内容已下线、跳转首页、内容无关 | 中 | 中 |
| 域名可注册 | 原域名已过期且可重新注册 | 高 | 低(且有风险) |
第三类不建议采用,重新注册过期域名做跳转属于典型灰产手法,与链接垃圾政策冲突。前两类才是正道。
判定死链时要注意状态码的语义:404 是未找到,410 是永久删除,两者都是明确的失效信号;301/302 跳转要看最终落地页是否与原主题相关,跳到首页的属于软死链;403 可能是屏蔽爬虫而非页面不存在,需要人工复核。
保姆级实操
步骤一:锁定候选资源页
找那些「链接列表型」的页面。检索式可以这样构造:
# 目标:找中文/英文资源页(在浏览器搜索框使用)
# "关键词" + "resources" / "推荐阅读" / "useful links" / "相关资源"
# intitle:resources "关键词"
# "关键词" inurl:links
每个主题筛出 20–40 个候选页,优先选教育机构、行业协会、政府站点、老牌博客这类维护频率低的页面,死链率最高。
步骤二:批量检测页面上的外链是否失效
用 Python 抓取页面外链并并发检测:
import concurrent.futures as cf
import re, requests
from bs4 import BeautifulSoup
HEADERS = {"User-Agent": "Mozilla/5.0 (compatible; BrokenLinkAudit/1.0)"}
PAGES = [
"https://example.org/resources/web-performance",
"https://example.edu/useful-links/wordpress",
]
def extract_links(page):
try:
r = requests.get(page, headers=HEADERS, timeout=20)
if r.status_code != 200:
return page, []
soup = BeautifulSoup(r.text, "html.parser")
out = [a["href"] for a in soup.find_all("a", href=True)
if a["href"].startswith("http")]
return page, out
except Exception:
return page, []
def probe(url):
try:
r = requests.head(url, headers=HEADERS, timeout=15,
allow_redirects=True)
return url, r.status_code, r.url
except Exception as e:
return url, 0, str(e)
with cf.ThreadPoolExecutor(max_workers=16) as ex:
pages = dict(ex.map(extract_links, PAGES))
all_links = sorted({u for v in pages.values() for u in v})
results = list(ex.map(probe, all_links))
for url, code, final in results:
if code in (404, 410) or code == 0:
print(f"[DEAD] {code} {url} -> {final}")
步骤三:人工复核软死链
脚本只能判断状态码,跳转首页、内容主题漂移、页面变成广告页这些要人工看。这一步不能省,否则会发出错误的提醒邮件。
步骤四:制作替代内容
替代页必须比原链接更「适合那个位置」:主题完全对口、内容长期稳定(不要放有时效性的新闻)、页面是纯内容而不是落地页、没有强营销语气。如果手上没有合适的页面,就现写一篇,别拿不太相关的页面凑数。
步骤五:确定联系人
优先找页面所属栏目的编辑、站点「关于」页里的邮箱、whois 里的联系邮箱(注意隐私脱敏后可能不可用)。找不到邮箱时用站点的联系表单。
步骤六:写邮件
结构固定为四句:指出具体位置(第几组链接里的哪一条)、说明它现在的状态(404)、给出你的替代资源一句话介绍、明确请对方替换。不要用营销口吻,不要附多个链接让对方选。
步骤七:跟进与记录
一周后跟进一次,仍无回复就放弃。所有候选页、检测结果、发送日期、回复状态记进台账,避免重复触达同一站点。
常见踩坑
- 用
requests.get全量下载页面,被对方站点限流甚至封 IP,应优先用HEAD并控制并发。 - 把 403 一律当死链,实际上很多站点只是屏蔽了非浏览器 UA。
- 替代内容用的是产品页或落地页,站长一眼看出是营销,不会替换。
- 邮件里没写清是哪个链接失效,站长无法快速验证,直接忽略。
- 同一站点被不同同事重复触达,被拉黑。
- 案例:某团队用脚本扫了 300 个资源页,把 1200 条 403 全当死链发邮件,其中 900 条其实是 Cloudflare 的 UA 拦截。邮件发出后被多个站长公开吐槽,品牌受损,后续真正有价值的触达也难推进。
- 替代页面 URL 后来被自己改掉,导致刚拿到的链接又变成新的死链。
总结
断链重建能否跑通,取决于三点:候选页是否真的维护滞后(死链多)、替代内容是否比原链接更合适、邮件是否让站长三秒内看懂问题。执行顺序是先用 HEAD 批量筛状态码,再人工复核软死链,最后才是发送邮件。脚本只负责第一轮筛选,人工判断不能省。这条路径属于 外链建设方法盘点 里风险最低的几类之一;拿到链接后要用 外链质量评估维度 筛一遍,锚文本的写法则遵循 锚文本策略 的分布原则。
