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

Abonnieren

Neue Beiträge zu Systemen, Infrastruktur und KI-Engineering.