怎样实现批量检测全站死链

wen 实用脚本 28

本文目录导读:

怎样实现批量检测全站死链

  1. 方案一:使用专业SEO工具(零代码,推荐入门)
  2. 方案二:使用命令行工具(批量、自动化、项目集成)
  3. 方案三:编写Python脚本(高度定制、可监控、可扩展)
  4. 方案四:使用网站地图(Sitemap)驱动
  5. 常见问题与优化技巧
  6. 总结建议

实现批量检测全站死链,通常需要借助专门的爬虫工具或编写脚本,死链(Broken Link)包括 HTTP 404(未找到)、500(服务器错误)、403(禁止访问)以及超时等状态。

以下是几种主流、高效的实现方案,从零代码到编程都有。

使用专业SEO工具(零代码,推荐入门)

这类工具功能强大、界面友好,能自动抓取网站所有链接并报告状态。

  1. Screaming Frog SEO Spider(最流行)

    • 原理:像蜘蛛一样爬取你指定的域名,提取所有链接并进行HTTP请求验证。
    • 步骤
      1. 下载并安装(免费版可爬取500条URL,够小站用)。
      2. 输入网站URL(https://www.example.com)。
      3. 点击 Start
      4. 爬取完成后,点击顶部工具栏的 Response Codes
      5. Ctrl+A 全选,然后右键 -> Filter -> Client Error (4xx)Server Error (5xx)
      6. 导出列表(.csv或.xlsx)。
  2. Xenu Link Sleuth(免费、轻量、快速)

    • 原理:老牌免费工具,专门用于检测死链和重定向。
    • 步骤
      1. 下载并打开(绿色软件,无需安装)。
      2. 菜单栏 File -> Check URL
      3. 输入网站首页地址(如 https://www.example.com)。
      4. 勾选“Check external links”(可选,检测外站链接)。
      5. 点击 OK
      6. 等待完成,所有“404 Not Found”、“500 Error”等就是死链。

使用命令行工具(批量、自动化、项目集成)

适合大规模、云服务器或需要集成到CI/CD流程的场景。

  1. broken-link-checker (Node.js 库)

    • 原理:纯JS爬虫,支持并发、重试、忽略robots.txt。

    • 安装与使用

      # 全局安装
      npm install -g broken-link-checker
      # 使用爬虫模式(递归检测)
      blc --recursive --exclude-external https://example.com
  2. LinkChecker (Python 库)

    • 原理:功能完善,支持HTTP、HTTPS、FTP,可输出多种格式。
    • 安装与使用
      pip install linkchecker
      linkchecker --check-extern --output=broken.html https://example.com

编写Python脚本(高度定制、可监控、可扩展)

如果你需要定制规则(比如只检测特定目录、需要登录或修改Referer),这是最佳选择。

核心思路

  1. 使用 requests 发送GET请求(通常只请求HEAD以节省带宽)。
  2. 使用 BeautifulSoup 提取所有 <a> 标签的 href 属性。
  3. 递归采集,去重,避免重复检测。
  4. 输出死链报告。

示例脚本(可根据需要修改)

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列表作为检测对象。

步骤

  1. 找到网站的 sitemap.xml 文件(通常在robots.txt里指定)。
  2. 下载并解析其中的所有 <loc> 标签(URL)。
  3. 并发请求(如Python的aiohttp 或Java的HttpClient)批量HEAD这些URL。
  4. 筛选出状态码非200、302的结果。

常见问题与优化技巧

  1. 被网站封IP

    • 设置User-Agent 为正常浏览器(如Mozilla/5.0...)。
    • 降低并发数:加 time.sleep(0.5) 或设置 max_workers=5
    • 使用代理池
  2. 外链过多

    • 一般只检测 内部链接(同域名,同子域名),外链死链可单独处理。
  3. 动态页面(JS渲染)

    • requests + BeautifulSoup 无法抓取JS,你需要使用 SeleniumPlaywright 来控制真实浏览器执行JavaScript后再提取链接。
    • 改进代码:使用 selenium.webdriver 代替 requests.get() 来获取页面源代码,其余逻辑不变。
  4. 登录态/权限

    • 有些页面需要登录后才能访问,先通过脚本登录,带上 CookieAuthorization Header。
    • 代码调整:在检查链接前,将登录后的 cookiesheaders 传递给 requests
  5. 只检测HEAD请求(节约带宽)

    • 大部分服务器支持HEAD方法,可以代替GET,脚本中把 requests.get 改为 requests.head(注意某些服务器可能会禁止HEAD,那时再回退到GET)。

总结建议

场景 推荐方案
小网站(<500页)、快速、零代码 Screaming FrogXenu
大网站、需要批量导出、报告 LinkChecker(Python命令行)
需要集成到CI/CD、自动化 broken-link-checker(Node.js)
需要高度定制(登录、过滤、复杂规则) Python脚本 + BeautifulSoup/Requests + Selenium(如需JS)

最后补充:无论用哪种方法,第一次检测前建议设置robots.txt(或工具中开启“忽略robots.txt”)以及设置合理的抓取间隔,避免给目标服务器造成负载压力。

抱歉,评论功能暂时关闭!