Go によるブラウザーオートメーション: Selenium、chromedp、Playwright、ZenRows

セレニウム、chromedp、Playwright、ZenRows - Goでの実装。

目次

正しいブラウザーオートメーションスタックとGoでのウェブスクレイピングの選択は、速度、メンテナンス、コードが実行される場所に影響を与えます。

この概要では、chromedpPlaywright for GoSelenium(Goクライアント)、ZenRowsの各ツールについて、コード例を含めて比較します。これにより、スクレイピング、E2Eテスト、スケジュールされたオートメーションに最適なツールを選択できます。

木のテーブル上のノートPCとVSCode

TL;DR - まとめ比較

ツール ブラウザの範囲 ランタイム 最適な用途
chromedp Chrome/Chromium 純粋なGo、サーバー不要 スクレイピング、軽量なオートメーション
Playwright Go Chromium, Firefox, WebKit Playwrightバイナリ E2Eテスト、クロスブラウザ、スクレイピング
Selenium (Go) 任意のWebDriver ドライバまたはグリッド 旧来のスイート、広範なエコシステム
ZenRows クラウド(API/ブラウザ) GoからHTTPで呼び出す プロキシ/アンチボット付きのスクレイピング

それぞれの使用ケース

chromedp - Chrome/ChromiumをChrome DevTools Protocol(CDP)経由で操作するGo言語のライブラリです。WebDriverやSeleniumサーバーは不要で、外部のランタイムも不要です。Chrome専用で、スクレイピングや軽量なオートメーションに最適です。Playwright for Goとの違いは、chromedpが純粋なGoで動作し、Chrome専用である点です。一方、Playwright for Goは複数のブラウザをサポートし、ブラウザのバイナリをインストールする必要があります。

Playwright for Go - Microsoft PlaywrightのGo言語バインディングです。Chromium、Firefox、WebKitの1つのAPIで操作でき、要素の自動待機、現代的なセレクタと機能が利用できます。クロスブラウザのE2Eテストが必要で、ブラウザのインストールステップに問題がない場合に使用します。

Selenium (Go) - 伝統的なWebDriverアプローチ:Goクライアントはブラウザドライバ(ChromeDriver、GeckoDriverなど)と通信します。SeleniumはGoをサポートしており、ドライバプロセスを実行したり、グリッドに接続したりできます。既存のスイートを維持する必要がある場合、または最も広範なエコシステムが必要な場合に使用します。新しいGoプロジェクトでは、chromedpまたはPlaywright for Goがセットアップを簡略化します。

ZenRows - ドライバライブラリではなく、GoからHTTPで呼び出すScraper API(およびオプションのScraping Browser)です。ZenRowsはヘッドレスブラウザ、JSレンダリング、住宅用プロキシ、アンチボット回避、CAPTCHAを処理します。スクレイピングが目的で、ブロックやレート制限に遭遇した場合に使用します。ローカルのE2Eテストでは、chromedpまたはPlaywrightが通常十分です。

Goのツールと構造のクイックリファレンスについては、Goプロジェクト構造: プラクティスとパターンを参照してください。オートメーションを専用パッケージに保つことは、internal/またはpkg/でうまく機能します。

chromedp: 純粋なGo、Chrome専用

chromedpは、第三パーティのバイナリを必要としません:GoでCDPを実装し、Chrome/Chromiumを起動(または接続)します。インストール:

go get -u github.com/chromedp/chromedp

例: ナビゲート、タイトルを読み取り、セレクタでテキストを抽出。 すべてのアクションはchromedp.Run内で実行されます;chromedp.ByQueryでCSSセレクタを使用します。

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/chromedp/chromedp"
)

func main() {
	ctx, cancel := chromedp.NewContext(context.Background())
	defer cancel()

	var title string
	var bodyText string
	err := chromedp.Run(ctx,
		chromedp.Navigate("https://example.com"),
		chromedp.Title(&title),
		chromedp.Text("h1", &bodyText, chromedp.ByQuery),
	)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("タイトル:", title)
	fmt.Println("見出し:", bodyText)
}

例: クリックし、更新されたHTMLを読み取る。 chromedp.Clickchromedp.OuterHTML(またはchromedp.InnerHTML)を使用し、chromedp.ByQueryでセレクタを指定します。targetURLをページに置き換えてください(例: テストサーバーまたは任意のURL):

	targetURL := "https://example.com"
	var outerBefore, outerAfter string
	err := chromedp.Run(ctx,
		chromedp.Navigate(targetURL),
		chromedp.OuterHTML("#content", &outerBefore, chromedp.ByQuery),
		chromedp.Click("#content", chromedp.ByQuery),
		chromedp.OuterHTML("#content", &outerAfter, chromedp.ByQuery),
	)

デフォルトでは、Chromeはヘッドレスで動作します。ウィンドウを表示するか、フラグを変更するには、カスタムアロケータを使用してください(chromedp ExecAllocator 例を参照)。DockerやCIで使用する場合、chromedp/headless-shellイメージは、chromedpがデフォルトで使用できるより小さなヘッドレスChromeの構築を提供します。これにより、ホストにChromeをインストールせずに、ヘッドレス環境でchromedpを実行できます。

さらに多くの例(スクリーンショット、PDF、フォーム、クッキー)は、chromedp/examplesリポジトリにあります。

Playwright for Go: クロスブラウザ、自動待機

Playwright for Goは、他の言語でのPlaywrightと同じマルチブラウザと自動待機機能を提供します。ライブラリをインストールした後、ブラウザのバイナリをインストールします:

go get -u github.com/playwright-community/playwright-go
go run github.com/playwright-community/playwright-go/cmd/playwright@latest install --with-deps

例: Chromiumを起動し、ページを開き、スクリーンショットを撮る。 他のエンジンではpw.Firefoxまたはpw.WebKitを使用できます。

package main

import (
	"log"

	"github.com/playwright-community/playwright-go"
)

func main() {
	pw, err := playwright.Run()
	if err != nil {
		log.Fatalf("could not launch playwright: %v", err)
	}
	defer pw.Stop()

	browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{Headless: playwright.Bool(true)})
	if err != nil {
		log.Fatalf("could not launch Chromium: %v", err)
	}
	defer browser.Close()

	page, err := browser.NewPage()
	if err != nil {
		log.Fatalf("could not create page: %v", err)
	}

	_, err = page.Goto("https://example.com")
	if err != nil {
		log.Fatalf("could not goto: %v", err)
	}

	_, err = page.Screenshot(playwright.PageScreenshotOptions{Path: playwright.String("example.png")})
	if err != nil {
		log.Fatalf("could not screenshot: %v", err)
	}
}

例: フォームを埋め込み、テキストを取得。 Playwrightは要素がアクション可能になるのを自動待機するため、CDPやSeleniumで明示的な待機がない場合に比べて不安定性が減少します。

	page.Goto("https://example.com/login")
	page.Locator("#username").Fill("user")
	page.Locator("#password").Fill("secret")
	page.Locator("button[type=submit]").Click()
	content, _ := page.Locator("h1").TextContent()
	fmt.Println(content)

Playwright for Goはウェブスクレイピングとテストの両方に使用できます:ナビゲート、クリック、HTMLやテキストを抽出、ZenRowsのScraping BrowserをCDP/Playwright互換のエンドポイント経由でドライブすることも可能です(アンチボットやプロキシが必要な場合)。

Selenium (Goクライアント)

SeleniumのWebDriver APIは、コミュニティクライアント(例: tebeka/selenium)経由でGoでも利用可能です。ブラウザドライバ(ChromeDriver、GeckoDriver)を実行したり、グリッドに接続したりします;GoコードはWebDriverコマンドを送信します。はい、SeleniumはGoをサポートしています - ドライバプロセスを管理するか、クラウドグリッドを使用する必要があります。

例: ChromeDriverに接続し、ナビゲートし、タイトルを取得。 ドライバが実行されている必要があります(例: chromedriver --port=4444またはSelenium 4のSelenium Manager)。

package main

import (
	"fmt"
	"log"

	"github.com/tebeka/selenium"
)

func main() {
	caps := selenium.Capabilities{"browserName": "chrome"}
	wd, err := selenium.NewRemote(caps, "http://localhost:4444/wd/hub")
	if err != nil {
		log.Fatal(err)
	}
	defer wd.Quit()

	err = wd.Get("https://example.com")
	if err != nil {
		log.Fatal(err)
	}
	title, err := wd.Title()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("タイトル:", title)
}

新しいGoプロジェクトでは、chromedp(ドライバ不要)またはPlaywright for Go(マルチブラウザ、自動待機)が通常より簡単です;Seleniumは既存のWebDriverスイートを維持する必要がある場合や、特定のグリッドが必要な場合に使用します。

ZenRows: GoからScraper API

ZenRowsはScraper API(HTTP)とオプションのScraping Browser(CDP/Playwright互換)を提供します。Goでは通常、Scraper APIを使用します:ターゲットURLとオプションを含むGET(またはPOST)を送信します;ZenRowsはレンダリングされたHTMLまたはその他のフォーマットを返します。ローカルのブラウザを管理する必要はありません。ZenRowsはスクレイピングが目的で、プロキシ、アンチボット回避、CAPTCHA処理が必要な場合に使用します;シンプルなローカルオートメーションには、chromedpまたはPlaywrightが十分です。

公式のGo SDKをインストール:

go get github.com/zenrows/zenrows-go-sdk/service/api

例: ZenRows Scraper APIを使用したシンプルなGETリクエスト。 APIキーをクライアントまたはZENROWS_API_KEY環境変数経由で設定します。

package main

import (
	"context"
	"fmt"
	"log"

	scraperapi "github.com/zenrows/zenrows-go-sdk/service/api"
)

func main() {
	client := scraperapi.NewClient(
		scraperapi.WithAPIKey("YOUR_API_KEY"),
	)

	response, err := client.Get(context.Background(), "https://example.com", nil)
	if err != nil {
		log.Fatal(err)
	}
	if err := response.Error(); err != nil {
		log.Fatal(err)
	}
	fmt.Println("Body length:", len(response.Body()))
	fmt.Println("Status:", response.Status())
}

例: JSレンダリングとプレミアムプロキシの使用。 RequestParametersで動作をカスタマイズします:

	params := &scraperapi.RequestParameters{
		JSRender:          true,
		UsePremiumProxies:  true,
		ProxyCountry:       "US",
	}
	response, err := client.Get(context.Background(), "https://example.com", params)
	if err != nil {
		log.Fatal(err)
	}
	if err := response.Error(); err != nil {
		log.Fatal(err)
	}
	html := response.String()

SDKは並列性制限(WithMaxConcurrentRequests)、リトライ(WithMaxRetryCountWithRetryWaitTime)など、その他のオプションをサポートします;ZenRows Scraper API Go SDKのドキュメントを参照してください。

まとめ

  • chromedp: 純粋なGo、CDP、Chrome専用;ドライバ不要。高速で低オーバーヘッドのオートメーションとスクレイピングに使用。必要に応じてDockerでchromedp/headless-shellを使用。
  • Playwright for Go: マルチブラウザ、自動待機、テスト向け。E2EテストやChromium、Firefox、WebKitの1つのAPIが必要な場合に使用;スクレイピングにも適しています。
  • Selenium (Go): GoからのWebDriver;ドライバまたはグリッドが必要。既存のSeleniumスイートを維持する必要がある場合、または特定のグリッドが必要な場合に使用します。
  • ZenRows: GoからのScraper API(およびScraping Browser)。スクレイピングが目的で、ブロック、レート制限、アンチボットに耐える必要がある場合に使用します。

Goのプラクティス(リント、プロジェクトレイアウト、依存関係注入)については、Goリント: コード品質のための必須ツールGoでの依存関係注入: パターンとベストプラクティス、およびGoチートシートを参照してください。GoでブラウザオートメーションとLLMパイプラインを組み合わせる場合、Go用Ollama SDKReranking with Ollama and Qwen3 Embedding in Goは役に立ちます。

関連投稿