字节笔记本

2026年3月22日

Katana - 下一代 Web 爬虫框架

本文介绍 Katana,由 ProjectDiscovery 团队开发的下一代网络爬虫和蜘蛛框架,专为自动化安全测试流程中的高效爬取而设计。凭借超过 16,000 个 GitHub Stars 和活跃的开源社区支持,Katana 已成为网络安全从业者进行漏洞扫描和信息收集的首选工具之一。

项目简介

Katana 是一款快速、高度可配置的 Web 爬虫框架,支持标准模式和 Headless 无头浏览器模式两种爬取方式。它由知名安全工具厂商 ProjectDiscovery 团队打造,与该团队旗下的 Nuclei、httpx、subfinder 等工具形成了完整的自动化安全测试工具链。Katana 的设计初衷是为自动化流水线(Automation Pipeline)提供高性能的爬取能力,能够快速发现目标网站中的端点(Endpoint)、API 路径和隐藏资源。

无论是独立使用还是集成到 CI/CD 流水线中,Katana 都能灵活适配各种使用场景。它支持从单个 URL、URL 列表文件或标准输入管道接收目标,并以纯文本或 JSONL 格式输出爬取结果,方便与其他安全工具进行联动处理。

核心特性

双模式爬取引擎

Katana 提供标准模式和 Headless 无头浏览器模式两种爬取方式。标准模式基于 Go 标准的 HTTP 库实现,速度极快,无浏览器开销,适合对一般静态网站的快速爬取。Headless 模式则在真实的浏览器上下文中执行爬取,能够解析 JavaScript 渲染的内容、处理异步请求,获得更高的端点覆盖率。

JavaScript 深度解析

通过 -jc(js-crawl)选项,Katana 可以对 JavaScript 文件进行深度解析,提取其中嵌入的 API 端点、路由路径等隐藏信息。此外还支持 jsluice 解析模式,能够更深入地分析 JavaScript 文件中的逻辑调用链路。

灵活的作用域控制

爬取行为如果不受控制,很容易演变成无休止的网络请求。Katana 提供了多层作用域控制机制:预定义字段作用域(dn、rdn、fqdn)、正则表达式匹配的爬取范围(crawl-scope)和排除范围(crawl-out-scope),以及禁用默认作用域的全网爬取模式。

可定制的表单自动填充

Katana 支持实验性的自动表单填充功能(-aff),能够自动识别并填写页面中的表单字段,从而发现登录后才能访问的隐藏端点。表单配置文件支持自定义字段值,可以根据目标网站特点灵活调整。

丰富的过滤和输出选项

内置基于正则表达式的 URL 匹配和过滤、文件扩展名匹配/排除、DSL 表达式高级过滤等多种过滤机制。输出方面支持纯文本、JSONL 格式,可自定义输出模板、存储原始请求响应数据,以及按字段分类存储结果。

验证码自动处理

在 Headless 模式下,Katana 支持自动检测和处理验证码,兼容 reCAPTCHA v2/v3、Cloudflare Turnstile、hCaptcha 等主流验证码类型,通过集成外部验证码解决服务实现自动化绕过。

速率限制与并发控制

提供请求延迟(delay)、并发数(concurrency)、并行度(parallelism)、每秒/每分钟请求限制(rate-limit)等多维度的速率控制选项,既能在允许的范围内高速爬取,也能避免因请求过于频繁而被目标封禁。

作为库使用

除了命令行工具外,Katana 还可以作为 Go 语言库集成到自定义程序中,通过创建 Option 结构体实例并调用 crawler.Crawl 方法来实现程序化的爬取功能。

技术栈

  • 核心语言:Go(96%),JavaScript(3.8%)
  • 许可证:MIT License
  • 最低 Go 版本:Go 1.25+
  • 包管理:Go Modules
  • 运行环境:支持 Linux、macOS、Windows,同时提供 Docker 镜像
  • 浏览器依赖:Headless 模式需要 Chromium 或 Google Chrome
  • 集成生态:可与 httpx、nuclei、subfinder 等 ProjectDiscovery 工具链无缝协作

安装指南

通过 Go 安装(推荐)

bash
CGO_ENABLED=1 go install github.com/projectdiscovery/katana/cmd/katana@latest

通过 Docker 安装

bash
docker pull projectdiscovery/katana:latest

Ubuntu 系统安装前置依赖

bash
sudo apt update && sudo apt install zip curl wget git
sudo snap install golang --classic
# 安装 Chrome 浏览器(Headless 模式所需)
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
sudo apt update && sudo apt install google-chrome-stable
go install github.com/projectdiscovery/katana/cmd/katana@latest

预编译二进制文件

从 GitHub Releases 页面下载对应平台的预编译二进制文件,无需安装 Go 环境即可直接使用。

快速开始

基本用法 -- 单个 URL 爬取

bash
katana -u https://tesla.com

多个 URL 爬取(逗号分隔)

bash
katana -u https://tesla.com,https://google.com

从文件读取 URL 列表

bash
katana -list url_list.txt

管道输入

bash
echo https://tesla.com | katana

与 httpx 联动使用

bash
cat domains | httpx | katana

Headless 模式爬取

bash
katana -u https://tesla.com -headless -system-chrome

使用示例

指定爬取深度

bash
katana -u https://tesla.com -d 5

启用 JavaScript 解析

bash
katana -u https://tesla.com -jc

限制爬取时间

bash
katana -u https://tesla.com -ct 2

自动表单填充

bash
katana -u https://tesla.com -aff

过滤相似 URL

bash
katana -u https://tesla.com -fsu

按扩展名过滤

bash
# 仅显示 JS、JSP、JSON 文件
katana -u https://tesla.com -silent -em js,jsp,json

# 过滤掉 CSS、TXT、MD 文件
katana -u https://tesla.com -silent -ef css,txt,md

使用正则过滤 URL

bash
# 仅匹配 shop 子域名
katana -u https://tesla.com -mr 'https://shop\.tesla\.com/*' -silent

# 过滤掉 www 子域名
katana -u https://tesla.com -fr 'https://www\.tesla\.com/*' -silent

DSL 高级过滤

bash
# 匹配状态码为 200 的端点
katana -u https://www.hackerone.com -mdc 'status_code == 200'

# 过滤使用 Cloudflare 的端点
katana -u https://www.hackerone.com -fdc 'contains(to_lower(technologies), "cloudflare")'

带认证的爬取

bash
# 通过自定义 Header 认证
katana -u https://tesla.com -H 'Cookie: usrsess=AmljNrESo'

# 从文件加载认证信息
katana -u https://tesla.com -H cookie.txt

连接活跃浏览器会话

bash
# 启动带远程调试的 Chrome(第一步)
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222

# 使用 WebSocket URL 连接已认证的浏览器会话(第二步)
katana -headless -u https://tesla.com -cwu ws://127.0.0.1:9222/devtools/browser/c5316c9c-19d6-42dc-847a-41d1aeebf7d6 -no-incognito

速率控制

bash
# 请求延迟 20 秒
katana -u https://tesla.com -delay 20

# 并发数 20
katana -u https://tesla.com -c 20

# 限制每秒 100 个请求
katana -u https://tesla.com -rl 100

输出控制

bash
# 输出到文件
katana -u https://example.com -no-scope -output example_endpoints.txt

# JSONL 格式输出
katana -u https://example.com -jsonl

# 自定义输出模板
katana -u https://example.com -output-template '{{email}} - {{url}}'

# 存储完整请求响应
katana -u https://example.com -no-scope -store-response

作为 Go 库使用

go
package main

import (
    "math"
    "github.com/projectdiscovery/gologger"
    "github.com/projectdiscovery/katana/pkg/engine/standard"
    "github.com/projectdiscovery/katana/pkg/types"
)

func main() {
    options := &types.Options{
        MaxDepth:     3,
        FieldScope:   "rdn",
        BodyReadSize: math.MaxInt,
        Timeout:      10,
        Concurrency:  10,
        Parallelism:  10,
        RateLimit:    150,
        Strategy:     "depth-first",
        OnResult: func(result output.Result) {
            gologger.Info().Msg(result.Request.URL)
        },
    }
    crawlerOptions, err := types.NewCrawlerOptions(options)
    if err != nil {
        gologger.Fatal().Msg(err.Error())
    }
    defer crawlerOptions.Close()
    crawler, err := standard.New(crawlerOptions)
    if err != nil {
        gologger.Fatal().Msg(err.Error())
    }
    defer crawler.Close()
    err = crawler.Crawl("https://www.hackerone.com")
    if err != nil {
        gologger.Warning().Msgf("Could not crawl: %s", err.Error())
    }
}

项目链接

分享: