Automatyzacja przegladarki w Go: Selenium, chromedp, Playwright, ZenRows
Selenium, chromedp, Playwright, ZenRows — w Go.
Wybór odpowiedniego stacka do automatyzacji przeglądarki i webscrapingu w Go wpływa na szybkość, utrzymanie i miejsce, w którym działa kod.
Ta prezentacja porównuje chromedp, Playwright for Go, Selenium (klient Go) oraz ZenRows z przykładami kodu dla każdego – abyś mógł wybrać najlepszy wariant do scrapingu, testów E2E lub automatyzacji zaplanowanej.

TL;DR – szybkie porównanie
| Narzędzie | Zakres przeglądarki | Środowisko uruchomieniowe | Najlepszy do |
|---|---|---|---|
| chromedp | Chrome/Chromium | Puro Go, bez serwera | Scraping, lekkie automatyzacje |
| Playwright Go | Chromium, Firefox, WebKit | Binarki Playwright | Testy E2E, wielobrowserskie, scraping |
| Selenium (Go) | Dowolny WebDriver | Driver lub grid | Starsze zestawy, szeroki ekosystem |
| ZenRows | Chmura (API/Browser) | HTTP z Go | Scraping z proxy/anti-bot |
Kiedy używać którego
chromedp – biblioteka idiomiczna w Go, która steruje Chrome/Chromium przez Chrome DevTools Protocol (CDP). Brak WebDrivera ani serwera Selenium; brak zewnętrznego środowiska uruchomieniowego. Idealna do scrapingu i lekkich automatyzacji, gdy tylko Chrome jest akceptowalny. Główne różnice w porównaniu do Playwright for Go to fakt, że chromedp to czysty Go i Chrome-only, podczas gdy Playwright obsługuje wiele przeglądarek i wymaga instalacji binarek przeglądarki.
Playwright for Go – komunitarnie utrzymywane powiązania Go do Microsoft Playwright. Jedna API dla Chromium, Firefox i WebKit; automatyczne oczekiwanie na elementy; nowoczesne selektory i funkcje. Używaj, gdy potrzebujesz testów E2E wielobrowserskich lub API skupionego na testach i jesteś zgodny z dodatkowym krokiem instalacji przeglądarek.
Selenium (Go) – klasyczne podejście WebDriver: klient Go komunikuje się z driverem przeglądarki (ChromeDriver, GeckoDriver itp.). Selenium obsługuje Go; uruchamiasz proces drivera lub łączy się z gridem. Używaj, gdy utrzymujesz starsze zestawy lub potrzebujesz najszerszego ekosystemu; dla nowych projektów w Go chromedp lub Playwright for Go często upraszczają konfigurację.
ZenRows – nie jest biblioteką sterującą, ale Scraper API (i opcjonalna Scraping Browser), którą wywołujesz z Go przez HTTP. ZenRows obsługuje przeglądarki bezpieczne, renderowanie JS, proxy rezydencyjne, omijanie anti-bot i CAPTCHA. Używaj, gdy celem jest scraping i napotykasz blokady lub limity przepustowości; do lokalnych testów E2E chromedp lub Playwright są zazwyczaj wystarczające.
Dla szybkiego odniesienia do narzędzi w Go i struktury projektu, zobacz Struktura projektu w Go: praktyki i wzorce; przechowywanie automatyzacji w dedykowanym pakiecie dobrze pasuje do internal/ lub pkg/.
chromedp: czysty Go, tylko Chrome
chromedp nie wymaga żadnych binarek trzecich stron: implementuje CDP w Go i uruchamia (lub łączy się z) Chrome/Chromium. Instalacja:
go get -u github.com/chromedp/chromedp
Przykład: nawigacja, odczyt tytułu i ekstrakcja tekstu według selektora. Wszystkie działania odbywają się wewnątrz chromedp.Run; użyj chromedp.ByQuery dla selektorów 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:", title)
fmt.Println("Heading:", bodyText)
}
Przykład: kliknięcie i odczyt zaktualizowanego HTML. Użyj chromedp.Click i chromedp.OuterHTML (lub chromedp.InnerHTML) z chromedp.ByQuery. Zastąp targetURL swoją stroną (np. serwer testowy lub dowolny 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),
)
Domyślnie Chrome działa bez głowicy. Aby wyświetlić okno lub zmienić flagi, użyj customowego allocatora (zobacz chromedp ExecAllocator example). Dla Docker lub CI obraz chromedp/headless-shell oferuje mniejsze, bezgłowiczne budowanie Chrome, które chromedp może używać z domyślnych ustawień – możesz uruchomić chromedp w środowiskach bezgłowicznych bez instalowania Chrome na hostowaniu.
Więcej przykładów (zrzuty ekranu, PDF, formularze, ciasteczka) znajdziesz w repozytorium chromedp/examples.
Playwright for Go: wielobrowserski, automatyczne oczekiwanie
Playwright for Go oferuje te same funkcje wielobrowserskie i automatyczne oczekiwanie jak Playwright w innych językach. Zainstaluj bibliotekę i następnie binarki przeglądarki:
go get -u github.com/playwright-community/playwright-go
go run github.com/playwright-community/playwright-go/cmd/playwright@latest install --with-deps
Przykład: uruchomienie Chromium, otwarcie strony, wykonanie zrzutu ekranu. Możesz użyć pw.Firefox lub pw.WebKit dla innych silników.
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)
}
}
Przykład: wypełnienie formularza i odczyt tekstu. Playwright automatycznie oczekuje, aż elementy będą aktywne, co zmniejsza flaktyczność w porównaniu do surowego CDP lub Selenium bez jawnych oczekiwań.
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)
Możesz używać Playwright for Go zarówno do scrapingu, jak i testów: nawiguj, klikaj, ekstrahuj HTML lub tekst, a opcjonalnie steruj Scraping Browserem ZenRows przez jego CDP/Playwright kompatybilny endpoint, gdy potrzebujesz anti-bot lub proxy.
Selenium (klient Go)
Interfejs API WebDriver Selenium jest dostępny w Go poprzez klienty społecznościowe (np. tebeka/selenium). Uruchamiasz driver przeglądarki (ChromeDriver, GeckoDriver) lub łączy się z gridem; kod Go wysyła polecenia WebDriver. Tak więc, tak, Selenium obsługuje Go – wystarczy, że zarządzasz procesem drivera lub używasz chmurowego gridu.
Przykład: połączenie z ChromeDriver, nawigacja, pobranie tytułu. Driver musi być uruchomiony (np. chromedriver --port=4444 lub Selenium Manager w 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("Title:", title)
}
Dla nowych projektów w Go chromedp (bez drivera) lub Playwright for Go (wielobrowserski, automatyczne oczekiwanie) są często łatwiejsze; używaj Selenium, gdy już masz zestawy WebDriver lub potrzebujesz konkretnego gridu.
ZenRows: Scraper API z Go
ZenRows oferuje Scraper API (HTTP) oraz opcjonalny Scraping Browser (kompatybilny z CDP/Playwright). Z Go zwykle używasz Scraper API: wysyłasz GET (lub POST) z adresem URL i opcjami; ZenRows zwraca wyrenderowany HTML lub inne formaty. Brak lokalnej przeglądarki do zarządzania. Używaj ZenRows, gdy celem jest scraping i potrzebujesz proxy, omijania anti-bot lub obsługi CAPTCHA; do prostych lokalnych automatyzacji chromedp lub Playwright są wystarczające.
Zainstaluj oficjalny SDK Go:
go get github.com/zenrows/zenrows-go-sdk/service/api
Przykład: prosty GET z ZenRows Scraper API. Ustaw swój klucz API przez klienta lub zmienną środowiskową 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())
}
Przykład: renderowanie JS i użycie premium proxy. Personalizuj zachowanie za pomocą 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 obsługuje limity współbieżności (WithMaxConcurrentRequests), ponowne próby (WithMaxRetryCount, WithRetryWaitTime) oraz inne opcje; zobacz dokumentację ZenRows Scraper API Go SDK.
Podsumowanie
- chromedp: czysty Go, CDP, tylko Chrome; brak drivera. Używaj do szybkiej, niskoprzeciążonej automatyzacji i scrapingu. Uruchom w Dockerze z chromedp/headless-shell, jeśli jest to konieczne.
- Playwright for Go: wielobrowserski, automatyczne oczekiwanie, przyjazny dla testów. Używaj do testów E2E lub jeśli chcesz jedno API dla Chromium, Firefox i WebKit; jest również dobre do scrapingu.
- Selenium (Go): WebDriver z Go; wymagany driver lub grid. Używaj, gdy utrzymujesz istniejące zestawy Selenium lub potrzebujesz konkretnego gridu.
- ZenRows: Scraper API (i Scraping Browser) z Go. Używaj, gdy celem jest scraping i potrzebujesz odporności na blokady, limity przepustowości i anti-bot.
Dla więcej praktyk w Go – analizatorów, układu projektu i iniekcji zależności – zobacz Analizatory Go: niezbędne narzędzia do jakości kodu, Iniekcja zależności w Go: wzorce i najlepsze praktyki, i Cheatsheet Go. Jeśli łączysz automatyzację przeglądarki z pipeline’ami LLM w Go, SDK Ollama dla Go i Reranking z Ollama i Qwen3 Embedding w Go są przydatnymi odnośnikami.
Powiązane wpisy
- Cheatsheet Go
- Analizatory Go: niezbędne narzędzia do jakości kodu
- Struktura projektu w Go: praktyki i wzorce
- Iniekcja zależności w Go: wzorce i najlepsze praktyki
- SDK Ollama dla Go – porównanie z przykładami
- Reranking dokumentów tekstowych z Ollama i Qwen3 Embedding model – w Go
- chromedp – pakiet Go
- Przykłady chromedp
- Playwright for Go
- GitHub playwright-go
- ZenRows Scraper API Go SDK
- Dokumentacja ZenRows
- Chrome DevTools Protocol