コンテンツにスキップ
hsblabs OSS

コアモジュールは、コンパイラ、診断、IR、HTTP ランタイム、オフラインスナップショットのランタイム、ブラウザアダプタのインターフェースを提供する。 Go 1.26 以降が必要である。

Terminal window
go get github.com/hsblabs/scrape-kdl@v1.0.4

go-rod アダプタは独立したモジュールである。 コアモジュール内のパッケージではない。

Terminal window
go get github.com/hsblabs/scrape-kdl/adapters/rod@v1.0.4

コアモジュールは go-rod を import してはならない。 これは好みではなく、プロジェクトの不変条件である。 ブラウザライブラリはアダプタに属する。

そのため、HTTP だけを使うアプリケーションの依存グラフに、Chromium、CDP、go-rod が入ることはない。 アダプタのモジュールを足すのは、ブラウザモードが必要になったときだけである。 go-rod アダプタ を参照。

package main
import (
"context"
"time"
scrapekdl "github.com/hsblabs/scrape-kdl"
)
func main() {
ctx := context.Background()
program, diagnostics, err := scrapekdl.CompileFile(ctx, "extractor.kdl")
if err != nil {
panic(err)
}
if diagnostics.HasErrors() {
panic(diagnostics)
}
result, err := program.Extract(ctx, map[string]any{"id": "123"}, scrapekdl.Options{
RequestTimeout: 15 * time.Second,
})
if err != nil {
panic(err)
}
var output struct {
Title string `json:"title"`
}
if err := result.Decode(&output); err != nil {
panic(err)
}
}

コンパイルは三つの値を返す。 プログラム、順序づけられた診断、そして運用上のエラーである。 プログラムを使う前に diagnostics.HasErrors() を検査する。

運用上のエラーは診断とは別のものである。 キャンセル、ファイルシステムの失敗、注入したローダの失敗は運用上のエラーである。 これらの関数は errors.Iserrors.As のために原因を保持する。 Go でのコンパイルと抽出 を参照。

関数 ソース
Compile(ctx, Source, CompileOptions) メモリ上のソース。
CompileFile(ctx, path) OS 上のファイル。
CompileFS(ctx, fsys, path) アプリケーションが持つ fs.FS

ValidateValidateFileValidateFS は、診断だけを返す対応物である。

CompileFSValidateFS は、ルートと各 import を io/fs の正当なパスに限定し、親への字句的な脱出を拒否する。 それでも真の権限を決めるのは、渡された fs.FS である。 os.DirFS はディレクトリ外へのシンボリックリンクをたどり得る。 封じ込めが必要なら os.Root.FS を使う。

metadata := program.Metadata()
metadata.Capabilities // the exact capabilities that the program needs
metadata.LanguageVersion
metadata.IRVersion
metadata.Files // each source file, with its SHA-256
descriptor := program.Descriptor()
descriptor.Source.FetchMode // "http" or "browser"
descriptor.Source.SessionPolicy // "none", "optional", or "required"

プログラムは不変であり、再利用できる実行計画を持つ。 ケイパビリティは、ホスト側でプログラムを許可するか拒否するかの判断に使う。 ディスクリプタは、IR 全体をデコードせずに取得方法を判断するために使う。

Program.IRJSON() は、交換やツール向けに Validated IR の全体を返す。

アダプタが文書化された所有権の契約に従うなら、プログラムは並行した抽出に対して安全である。 可変な状態は一つの抽出の内側にとどまる。

例外は、一つのページを制御するブラウザアダプタである。 このアダプタは BrowserAdapterLease を実装しなければならず、リースが操作の交錯を防ぐ。 真の並列実行には、複数のページか複数のアダプタを使う。

コアモジュールは CLI も含む。

Terminal window
go install github.com/hsblabs/scrape-kdl/cmd/scrape-kdl@v1.0.4

CLI を参照。