Browser Automation in Go: Selenium, chromedp, Playwright, ZenRows

Selenium, chromedp, Playwright, ZenRows – in Go.

Inhaltsverzeichnis

Die Wahl des richtigen Browser-Automatisierungs-Stacks und Web-Scraping in Go beeinflusst Geschwindigkeit, Wartung und den Ort, an dem Ihr Code läuft.

Dieser Überblick vergleicht chromedp, Playwright for Go, Selenium (Go-Client) und ZenRows mit Codebeispielen für jedes Tool, damit Sie die beste Wahl für Scraping, E2E-Tests oder geplante Automatisierung treffen können.

Laptop auf dem Holztisch mit VSCode

TL;DR - Schnellvergleich

Tool Browser-Bereich Laufzeit Bestens geeignet
chromedp Chrome/Chromium Reiner Go, kein Server Scraping, leichte Automatisierung
Playwright Go Chromium, Firefox, WebKit Playwright-Binärdateien E2E-Tests, Kreuzbrowser, Scraping
Selenium (Go) Jeder WebDriver Driver oder Grid Legacy-Suiten, breites Ökosystem
ZenRows Cloud (API/Browser) HTTP von Go Scraping mit Proxys/anti-Bot

Wann welches Tool verwenden

chromedp - Idiomatisches Go-Modul, das Chrome/Chromium über das Chrome DevTools Protocol (CDP) steuert. Kein WebDriver oder Selenium-Server; kein externer Laufzeitumgebung. Ideal für Scraping und leichte Automatisierung, wenn nur Chrome akzeptabel ist. Der Hauptunterschied zu Playwright for Go besteht darin, dass chromedp reiner Go ist und Chrome-only ist, während Playwright mehrere Browser unterstützt und die Installation von Browser-Binärdateien erfordert.

Playwright for Go - Community-gemainte Go-Bindungen für Microsoft Playwright. Eine API für Chromium, Firefox und WebKit; automatisches Warten auf Elemente; moderne Selektoren und Features. Verwenden Sie es, wenn Sie E2E-Tests mit Kreuzbrowser oder eine testorientierte API benötigen und mit einem zusätzlichen Installations-Schritt für Browser einverstanden sind.

Selenium (Go) - Der klassische WebDriver-Ansatz: ein Go-Client kommuniziert mit einem Browser-Drive (ChromeDriver, GeckoDriver usw.). Selenium unterstützt Go; Sie laufen einen Driver-Prozess oder verbinden sich mit einem Grid. Verwenden Sie es für Legacy-Suiten oder wenn Sie das breiteste Ökosystem benötigen; für neue Go-Projekte vereinfachen chromedp oder Playwright for Go oft die Einrichtung.

ZenRows - Kein Drive-Modul, sondern eine Scraper-API (und optionaler Scraping Browser), den Sie von Go über HTTP aufrufen. ZenRows verarbeitet headless Browser, JS-Rendern, Wohnungsproxys, anti-Bot-Überwindung und CAPTCHA. Verwenden Sie es, wenn Ihr Ziel das Scraping ist und Sie auf Blocks oder Rate-Limits stoßen; für lokale E2E-Tests sind chromedp oder Playwright in der Regel ausreichend.

Für einen schnellen Referenzpunkt zu Go-Tools und Struktur siehe Go Projektstruktur: Praktiken & Muster; die Aufbewahrung von Automatisierung in einem dedizierten Paket passt gut zu internal/ oder pkg/.

chromedp: reiner Go, Chrome-only

chromedp benötigt keine dritten Binärdateien: es implementiert die CDP in Go und startet (oder verbindet sich mit) Chrome/Chromium. Installieren Sie:

go get -u github.com/chromedp/chromedp

Beispiel: navigieren, Titel lesen und Text über Selektor extrahieren. Alle Aktionen laufen innerhalb von chromedp.Run; verwenden Sie chromedp.ByQuery für CSS-Selektoren.

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("Titel:", title)
	fmt.Println("Überschrift:", bodyText)
}

Beispiel: klicken und aktualisierten HTML lesen. Verwenden Sie chromedp.Click und chromedp.OuterHTML (oder chromedp.InnerHTML) mit chromedp.ByQuery. Ersetzen Sie targetURL mit Ihrer Seite (z. B. ein Testserver oder jede 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),
	)

Standardmäßig läuft Chrome headless. Um ein Fenster anzuzeigen oder Flags zu ändern, verwenden Sie einen benutzerdefinierten Allocator (siehe das chromedp ExecAllocator Beispiel). Für Docker oder CI bietet das chromedp/headless-shell Bild eine kleinere headless Chrome-Buildversion, die chromedp ohne Installation von Chrome auf dem Host verwenden kann.

Weitere Beispiele (Screenshots, PDFs, Formulare, Cookies) finden Sie im chromedp/examples Repository.

Playwright for Go: Kreuzbrowser, automatisches Warten

Playwright for Go bietet die gleichen multibrowser- und automatischen Wartezeiten-Features wie Playwright in anderen Sprachen. Installieren Sie die Bibliothek und dann die Browser-Binärdateien:

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

Beispiel: Chromium starten, eine Seite öffnen, einen Screenshot machen. Sie können pw.Firefox oder pw.WebKit für andere Motoren verwenden.

package main

import (
	"log"

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

func main() {
	pw, err := playwright.Run()
	if err != nil {
		log.Fatalf("konnte Playwright nicht starten: %v", err)
	}
	defer pw.Stop()

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

	page, err := browser.NewPage()
	if err != nil {
		log.Fatalf("konnte keine Seite erstellen: %v", err)
	}

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

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

Beispiel: ein Formular füllen und Text erhalten. Playwright wartet automatisch auf Elemente, die handlbar sind, was im Vergleich zu roher CDP oder Selenium ohne explizite Wartezeiten die Stabilität reduziert.

	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)

Sie können Playwright for Go sowohl für Web-Scraping als auch für Tests verwenden: navigieren, klicken, HTML- oder Text extrahieren und optional den ZenRows Scraping Browser über dessen CDP/Playwright-kompatiblen Endpunkt steuern, wenn Sie anti-Bot oder Proxys benötigen.

Selenium (Go-Client)

Die WebDriver-API von Selenium ist in Go über Community-Clients (z. B. tebeka/selenium) verfügbar. Sie laufen einen Browser-Drive (ChromeDriver, GeckoDriver) oder verbinden sich mit einem Grid; der Go-Code sendet WebDriver-Befehle. Ja, Selenium unterstützt Go – Sie müssen nur den Drive-Prozess verwalten oder ein Cloud-Grid verwenden.

Beispiel: Verbindung zu ChromeDriver, Navigieren, Titel erhalten. Der Drive muss laufen (z. B. chromedriver --port=4444 oder Selenium Manager in Selenium 4).

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("Titel:", title)
}

Für neue Go-Projekte sind chromedp (kein Drive) oder Playwright for Go (multibrowser, automatisches Warten) oft einfacher; verwenden Sie Selenium, wenn Sie bestehende WebDriver-Suiten verwalten oder ein bestimmtes Grid benötigen.

ZenRows: Scraper API von Go

ZenRows bietet eine Scraper API (HTTP) und einen optionalen Scraping Browser (CDP/Playwright-kompatibel). Von Go aus verwenden Sie in der Regel die Scraper API: senden Sie eine GET- (oder POST-)Anfrage mit dem Ziel-URL und Optionen; ZenRows gibt das gerenderte HTML oder andere Formate zurück. Kein lokaler Browser zu verwalten. Verwenden Sie ZenRows, wenn das Scraping das Ziel ist und Sie Proxys, anti-Bot-Überwindung oder CAPTCHA-Verarbeitung benötigen; für einfache lokale Automatisierung sind chromedp oder Playwright ausreichend.

Installieren Sie die offizielle Go-SDK:

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

Beispiel: einfache GET-Anfrage mit der ZenRows Scraper API. Legen Sie Ihren API-Schlüssel über den Client oder die Umgebungsvariable ZENROWS_API_KEY fest.

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-Länge:", len(response.Body()))
	fmt.Println("Status:", response.Status())
}

Beispiel: JS-Rendern und Premium-Proxys. Passen Sie das Verhalten mit RequestParameters an:

	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()

Das SDK unterstützt Konkurrenzbeschränkungen (WithMaxConcurrentRequests), Wiederholungen (WithMaxRetryCount, WithRetryWaitTime) und andere Optionen; siehe die ZenRows Scraper API Go SDK Dokumentation.

Zusammenfassung

  • chromedp: Reiner Go, CDP, Chrome-only; kein Drive. Verwenden Sie es für schnelle, geringe Overhead-Automatisierung und Scraping. Führen Sie es bei Bedarf in Docker mit chromedp/headless-shell aus.
  • Playwright for Go: Multibrowser, automatisches Warten, testfreundlich. Verwenden Sie es für E2E-Tests oder wenn Sie eine API für Chromium, Firefox und WebKit benötigen; auch gut für Scraping.
  • Selenium (Go): WebDriver von Go; Drive oder Grid erforderlich. Verwenden Sie es, wenn Sie bestehende Selenium-Suiten verwalten oder ein bestimmtes Grid benötigen.
  • ZenRows: Scraper API (und Scraping Browser) von Go. Verwenden Sie es, wenn das Scraping das Ziel ist und Sie Resilienz gegenüber Blocks, Rate-Limits und anti-Bot benötigen.

Für weitere Go-Praktiken – Linter, Projektlayout und Abhängigkeitsinjektion – siehe Go Linters: Essential Tools for Code Quality, Dependency Injection in Go: Patterns & Best Practices, und den Go Cheatsheet. Wenn Sie Browser-Automatisierung mit LLM-Pipelines in Go kombinieren, sind die Go SDKs for Ollama und Reranking with Ollama and Qwen3 Embedding in Go nützliche Referenzen.

Verwandte Beiträge