YouTube の個別の動画ページの html を見ていて、script 中に url が書かれていたので手繰っていったら、json ぽかったので chromedp で抽出できるかなと思ったら出来たので書いてみました。
ちなみに、これで出てきたのを struct にすると590行くらいになりましたが、struct にして読み込みしてもサクサク動いてました。
そんなバカでかい struct を意味なくここに書くのもどうかと思いますので動かしてみてください。
package main import ( "context" "encoding/json" "fmt" "log" "os" "github.com/chromedp/cdproto/runtime" "github.com/chromedp/chromedp" ) func main() { allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), []chromedp.ExecAllocatorOption{ chromedp.ExecPath(`C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe`), chromedp.NoFirstRun, chromedp.NoDefaultBrowserCheck, chromedp.Headless, chromedp.Flag("disable-extensions", false), chromedp.Flag("enable-automation", false), chromedp.Flag("restore-on-startup", false), }...) defer cancel() ctx, cancel := chromedp.NewContext(allocCtx, chromedp.WithErrorf(log.Printf)) defer cancel() var res *runtime.RemoteObject err := chromedp.Run(ctx, chromedp.Navigate(`https://www.youtube.com/watch?v=ZRtdQ81jPUQ`), chromedp.EvaluateAsDevTools(`ytInitialPlayerResponse`, &res, chromedp.EvalAsValue), ) if err != nil { log.Println(err) } jsonMarshaled, err := json.Marshal(res) if err != nil { log.Println(err) } // json ファイル作成用 file := "ytInitialPlayerResponse.json" fp, err := os.Create(file) if err != nil { log.Println(err) return } defer fp.Close() err = os.WriteFile(file, []byte(jsonMarshaled), 0664) if err != nil { log.Println(err) } }