Automatyzacja przegladarki w Go: Selenium, chromedp, Playwright, ZenRows

Selenium, chromedp, Playwright, ZenRows — w Go.

Page content

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.

laptop na drewnianej biurce z vscode

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