利用 Katana 作爲 Go 庫實現高性能 Web 爬蟲
在信息收集、安全測試等領域,高性能、高併發的 Web 爬蟲工具是核心基礎設施之一。ProjectDiscovery 出品的 Katana 是一個基於 Golang 編寫的輕量級爬蟲,它默認以 CLI 工具形式提供。但實際上,它也可以作爲庫被直接集成進你的 Go 項目中,從而實現更靈活的定製。本文將介紹:Katana 的設計理念與功能,如何將 Katana 作爲庫引入到我們的項目當中,如何編寫自定義爬蟲邏輯和咱們擴展 Katana 的爬取策略或輸出邏輯
Katana 簡介
Katana 是 ProjectDiscovery 團隊開發的一款現代化 Web 爬蟲,支持以下特性:
-
支持 JS 渲染(基於 rod)
-
多線程異步爬取
-
自動提取 URL、表單、JS 鏈接等
-
可配置爬取深度、過濾條件
-
支持自定義輸入源與輸出
在默認 CLI 使用中,它是個強大的爬蟲終端工具。但 Katana 的強大之處在於它本質上是模塊化設計,核心功能可以像 SDK 一樣在你自己的項目中使用。
將 Katana 作爲庫使用
首先,Katana 本質是一個 Go 模塊。你可以直接在你的項目中引入它,具體操作如下所示:
mkdir katana-demo
cd katana-demo/
go mod init katana-demo
go get github.com/projectdiscovery/katana/pkg/output
go get github.com/projectdiscovery/katana/pkg/engine/common@v1.1.2
使用 Katana 掃描單個 URL, 具體鍵入如下代碼:
package main
import (
"math"
"github.com/projectdiscovery/gologger"
"github.com/projectdiscovery/katana/pkg/engine/standard"
"github.com/projectdiscovery/katana/pkg/output"
"github.com/projectdiscovery/katana/pkg/types"
)
func main() {
options := &types.Options{
MaxDepth: 3, // 最大爬取深度
FieldScope: "rdn", // 爬取範圍字段(例如,根域名)
BodyReadSize: math.MaxInt, // 最大響應體讀取大小
Timeout: 10, // 請求超時時間,單位爲秒
Concurrency: 10, // 併發爬取的 goroutine 數量
Parallelism: 10, // 處理 URL 的 goroutine 數量
Delay: 0, // 每次爬取請求之間的延遲時間,單位爲秒
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()
var input = "http://www.baidu.com"
err = crawler.Crawl(input)
if err != nil {
gologger.Warning().Msgf("無法爬取 %s: %s", input, err.Error())
}
}
運行效果如下所示:
解析:
-
types.Options 用於配置爬蟲
-
CrawlerOptions 包含用於爬蟲程序的輔助工具集
-
NewCrawlerOptions 根據用戶指定的選項創建一個新的爬蟲配置結構體。
-
standard.New 方法創建一個新的標準爬蟲實例。
-
Crawl方法使用指定配置抓取 URL。
結語
將 Katana 作爲庫使用,能極大提升我們在信息收集、滲透測試中構建定製爬蟲能力。不再依賴 CLI,而是可以將其深度融合進更復雜的系統之中,例如漏洞掃描框架、資產發現平臺,定製爬蟲模塊,自動化掃描系統,使用 Katana 都是一個優秀的底層模塊選擇。
參考資料
-
項目主頁:https://github.com/projectdiscovery/katana
-
文檔:https://github.com/projectdiscovery/katana#?tab=readme-ov-file#katana-as-a-library
-
Headless 支持:https://github.com/go-rod/rod
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Nbz9UAgMlEs12YtYhrhTvA