全站死链监控:别让烂内链拖住蜘蛛的后腿

来源:互联网 时间:2026-09-09

改版、删文章、换栏目,最先烂掉的不是页面而是内链。烂内链的代价常常被低估:用户点进去 404 是体验问题,更重的是蜘蛛顺着内链爬行时一遍遍撞墙,抓取预算被无谓消耗,深度页面的发现效率跟着下降。单页小站可以用 W3C 的 Link Checker 在线查,几个 URL 等一分钟就出结果;页面一多就得自己动手了。

自建监控的思路是个简化爬虫:从首页出发抓页面,提取站内链接,逐个请求验状态码,404、超时、5xx 全记下来,再顺着新发现的链接往外爬,直到全站扫完。加个线程池并发提速,但要压住并发数——扫描自己是别把自己扫挂了。

import re, requests
from concurrent.futures import ThreadPoolExecutor
from urllib.parse import urldefrag

HEADERS = {"User-Agent": "Mozilla/5.0 (compatible; linkcheck/1.0)"}
BASE = "https://www.网址 .com"

def check(path):
r = requests.get(BASE + path, headers=HEADERS, timeout=10)
return path, r.status_code

def get_links(path):
r = requests.get(BASE + path, headers=HEADERS, timeout=10)
r.raise_for_status()
links = set()
for href in re.findall(r'href="([^"#]+)"', r.text):
u = urldefrag(href)[0]
if u.startswith("/") and not u.startswith("//"):
links.add(u)
return links

主循环用一个待爬队列加已访问集合去重,发现死链就落名单。图片、CSS 这类资源链接会被 href 正则自然漏掉,不过死链监控的重点是页面级链接,够用了。真要连资源一起查,把 src 属性也抓出来丢进检查队列即可。

seen, bad, todo = set(), [], ["/"]
with ThreadPoolExecutor(max_workers=5) as pool:
while todo:
path = todo.pop()
if path in seen:
continue
seen.add(path)
try:
links = get_links(path)
todo.extend(links - seen)
except requests.RequestException as e:
bad.append((path, type(e).__name__))
continue
# 页面本身状态码验证(并发)
for p, code in pool.map(check, [path]):
if code >= 400:
bad.append((p, code))

print("共检查", len(seen), "个页面,死链", len(bad), "个")
for p, why in bad:
print("死链:", p, why)

验证环节别偷懒:脚本报出的死链逐条用 curl -I 复核一遍,排除掉脚本自己的网络抖动误报。确认是真死链后,修法和之前讲的一致——有替代内容的 301,没有的保持 404,同时回头修掉站内指向它的入口,这才是闭环。光清死链不修入口,下周再跑一遍又是一样一批。

# 复核脚本报告的死链
curl -sI https://www.example.com/old-tag/seo | head -1

# 挂进 crontab,每周一凌晨 4 点全站扫一次
0 4 * * 1 /usr/bin/python3 /opt/seo/linkcheck.py \
>> /var/log/linkcheck.log 2>&1

脚本扫完还能做一步交叉分析:拿爬虫见过的 URL 集合,和蜘蛛日志里撞 404 的 URL 清单对比。蜘蛛撞了、爬虫却从来没发现过链接的,说明入口不在站内,多半来自外链或搜索引擎缓存的旧地址——这类死点站内修不了,只能靠 301 接住,两份工具互相补盲区。

收尾划一下和断链建设的边界:之前写过一篇断链建设,那是去找别人网站上指向本站却失效的外链,属于外链资源回收;这一篇是守住自己站内的链接质量,属于内功。一外一内互不替代。W3C Link Checker 的正确用法是抽查新页面和小站全检,自建爬虫管全站例行监控,两件工具放在一个工具箱里正好。

相关阅读:全站死链扫描吃资源,跑的频率有讲究。《SEO 自动化总清单:日、周、月、季各该跑什么》把它安排在低峰时段的每周组,具体时间点总纲里给了现成排法。

相关文章

标签:

A5创业网 版权所有