本文目录导读:

- 方案一:使用专业SEO工具(零代码,推荐入门)
- 方案二:使用命令行工具(批量、自动化、项目集成)
- 方案三:编写Python脚本(高度定制、可监控、可扩展)
- 方案四:使用网站地图(Sitemap)驱动
- 常见问题与优化技巧
- 总结建议
实现批量检测全站死链,通常需要借助专门的爬虫工具或编写脚本,死链(Broken Link)包括 HTTP 404(未找到)、500(服务器错误)、403(禁止访问)以及超时等状态。
以下是几种主流、高效的实现方案,从零代码到编程都有。
使用专业SEO工具(零代码,推荐入门)
这类工具功能强大、界面友好,能自动抓取网站所有链接并报告状态。
-
Screaming Frog SEO Spider(最流行)
- 原理:像蜘蛛一样爬取你指定的域名,提取所有链接并进行HTTP请求验证。
- 步骤:
- 下载并安装(免费版可爬取500条URL,够小站用)。
- 输入网站URL(
https://www.example.com)。 - 点击 Start。
- 爬取完成后,点击顶部工具栏的 Response Codes
- Ctrl+A 全选,然后右键 -> Filter -> Client Error (4xx) 和 Server Error (5xx)。
- 导出列表(.csv或.xlsx)。
-
Xenu Link Sleuth(免费、轻量、快速)
- 原理:老牌免费工具,专门用于检测死链和重定向。
- 步骤:
- 下载并打开(绿色软件,无需安装)。
- 菜单栏 File -> Check URL。
- 输入网站首页地址(如
https://www.example.com)。 - 勾选“Check external links”(可选,检测外站链接)。
- 点击 OK。
- 等待完成,所有“404 Not Found”、“500 Error”等就是死链。
使用命令行工具(批量、自动化、项目集成)
适合大规模、云服务器或需要集成到CI/CD流程的场景。
-
broken-link-checker (Node.js 库)
-
原理:纯JS爬虫,支持并发、重试、忽略robots.txt。
-
安装与使用:
# 全局安装 npm install -g broken-link-checker # 使用爬虫模式(递归检测) blc --recursive --exclude-external https://example.com
-
-
LinkChecker (Python 库)
- 原理:功能完善,支持HTTP、HTTPS、FTP,可输出多种格式。
- 安装与使用:
pip install linkchecker linkchecker --check-extern --output=broken.html https://example.com
编写Python脚本(高度定制、可监控、可扩展)
如果你需要定制规则(比如只检测特定目录、需要登录或修改Referer),这是最佳选择。
核心思路:
- 使用
requests发送GET请求(通常只请求HEAD以节省带宽)。 - 使用
BeautifulSoup提取所有<a>标签的href属性。 - 递归采集,去重,避免重复检测。
- 输出死链报告。
示例脚本(可根据需要修改):
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, urljoin
import concurrent.futures
visited_urls = set() # 记录已访问的URL
broken_links = [] # 记录死链
def get_valid_urls(base_url, soup):
urls = set()
for a_tag in soup.find_all('a', href=True):
href = a_tag['href']
# 拼接完整URL
full_url = urljoin(base_url, href)
# 只保留同协议(http/https)的同域名链接
parsed = urlparse(full_url)
if parsed.netloc == urlparse(base_url).netloc and parsed.scheme in ['http', 'https']:
# 过滤掉锚点、javascript等
if not full_url.startswith('#') and not full_url.startswith('javascript:'):
urls.add(full_url)
return urls
def check_link(url):
"""检测单个链接是否是死链"""
try:
response = requests.get(url, timeout=10, allow_redirects=False)
# 4xx或5xx算死链
if response.status_code >= 400:
broken_links.append((url, response.status_code))
print(f"Dead link: {url} - Status: {response.status_code}")
except requests.exceptions.RequestException as e:
broken_links.append((url, str(e)))
print(f"Error link: {url} - {e}")
def crawl(entry_url):
if entry_url in visited_urls:
return
visited_urls.add(entry_url)
try:
response = requests.get(entry_url, timeout=10)
soup = BeautifulSoup(response.text, 'html.parser')
internal_urls = get_valid_urls(entry_url, soup)
# 检测当前页面的所有内部链接
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
executor.map(check_link, internal_urls)
# 进一步爬取(限制深度避免过深)
for url in internal_urls:
if url not in visited_urls:
crawl(url)
except:
pass # 如果页面本身打不开,则跳过进一步爬取
if __name__ == "__main__":
start_url = "https://example.com"
print("开始全站死链检测...")
crawl(start_url)
# 输出最终结果
print("\n\n========== 死链报告 ==========")
for url, status in broken_links:
print(f"{status} - {url}")
使用网站地图(Sitemap)驱动
如果网站很大(几万甚至几十万条URL),直接从首页爬取可能遗漏很多深层页面,可以用Sitemap列表作为检测对象。
步骤:
- 找到网站的
sitemap.xml文件(通常在robots.txt里指定)。 - 下载并解析其中的所有
<loc>标签(URL)。 - 用 并发请求(如Python的
aiohttp或Java的HttpClient)批量HEAD这些URL。 - 筛选出状态码非200、302的结果。
常见问题与优化技巧
-
被网站封IP:
- 设置User-Agent 为正常浏览器(如
Mozilla/5.0...)。 - 降低并发数:加
time.sleep(0.5)或设置max_workers=5。 - 使用代理池。
- 设置User-Agent 为正常浏览器(如
-
外链过多:
- 一般只检测 内部链接(同域名,同子域名),外链死链可单独处理。
-
动态页面(JS渲染):
requests+BeautifulSoup无法抓取JS,你需要使用 Selenium 或 Playwright 来控制真实浏览器执行JavaScript后再提取链接。- 改进代码:使用
selenium.webdriver代替requests.get()来获取页面源代码,其余逻辑不变。
-
登录态/权限:
- 有些页面需要登录后才能访问,先通过脚本登录,带上
Cookie或AuthorizationHeader。 - 代码调整:在检查链接前,将登录后的
cookies或headers传递给requests。
- 有些页面需要登录后才能访问,先通过脚本登录,带上
-
只检测HEAD请求(节约带宽):
- 大部分服务器支持
HEAD方法,可以代替GET,脚本中把requests.get改为requests.head(注意某些服务器可能会禁止HEAD,那时再回退到GET)。
- 大部分服务器支持
总结建议
| 场景 | 推荐方案 |
|---|---|
| 小网站(<500页)、快速、零代码 | Screaming Frog 或 Xenu |
| 大网站、需要批量导出、报告 | LinkChecker(Python命令行) |
| 需要集成到CI/CD、自动化 | broken-link-checker(Node.js) |
| 需要高度定制(登录、过滤、复杂规则) | Python脚本 + BeautifulSoup/Requests + Selenium(如需JS) |
最后补充:无论用哪种方法,第一次检测前建议设置robots.txt(或工具中开启“忽略robots.txt”)以及设置合理的抓取间隔,避免给目标服务器造成负载压力。