Go によるブラウザーオートメーション: Selenium、chromedp、Playwright、ZenRows
セレニウム、chromedp、Playwright、ZenRows - Goでの実装。
正しいブラウザーオートメーションスタックとGoでのウェブスクレイピングの選択は、速度、メンテナンス、コードが実行される場所に影響を与えます。
この概要では、chromedp、Playwright for Go、Selenium(Goクライアント)、ZenRowsの各ツールについて、コード例を含めて比較します。これにより、スクレイピング、E2Eテスト、スケジュールされたオートメーションに最適なツールを選択できます。

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.Clickとchromedp.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)、リトライ(WithMaxRetryCount、WithRetryWaitTime)など、その他のオプションをサポートします;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 SDKとReranking with Ollama and Qwen3 Embedding in Goは役に立ちます。