Автоматизация браузеров на Go: Selenium, chromedp, Playwright, ZenRows

Selenium, chromedp, Playwright, ZenRows — на Go.

Содержимое страницы

Выбор правильного стека для автоматизации браузера и веб-скрейпинга на Go влияет на скорость, обслуживание и место выполнения вашего кода.

Это обзор сравнивает chromedp, Playwright для Go, Selenium (Go клиент) и ZenRows с примерами кода для каждого, чтобы вы могли выбрать лучший вариант для скрейпинга, E2E тестов или запланированной автоматизации.

ноутбук на деревянном столе с vscode

TL;DR - Быстрое сравнение

Инструмент Область браузера Время выполнения Лучше всего для
chromedp Chrome/Chromium Чистый Go, без сервера Скрейпинг, легкая автоматизация
Playwright Go Chromium, Firefox, WebKit Бинарные файлы Playwright E2E тесты, кросс-браузер, скрейпинг
Selenium (Go) Любой WebDriver Драйвер или грид Устаревшие наборы, широкий экосистема
ZenRows Облако (API/Браузер) HTTP из Go Скрейпинг с прокси/анти-бот

Когда использовать что

chromedp - Идиоматическая библиотека Go, которая управляет Chrome/Chromium через Chrome DevTools Protocol (CDP). Нет WebDriver или сервера Selenium; нет внешнего времени выполнения. Идеально для скрейпинга и легкой автоматизации, когда Chrome-only приемлем. Основное отличие от Playwright для Go заключается в том, что chromedp является чистым Go и Chrome-only, в то время как Playwright поддерживает несколько браузеров и требует установки бинарных файлов браузеров.

Playwright для Go - Поддерживаемые сообществом Go привязки для Microsoft Playwright. Один API для Chromium, Firefox и WebKit; автоматическое ожидание элементов; современные селекторы и функции. Используйте его, когда вам нужны кросс-браузерные E2E тесты или API, ориентированный на тестирование, и вы готовы к дополнительному шагу установки браузеров.

Selenium (Go) - Классический подход WebDriver: Go клиент общается с драйвером браузера (ChromeDriver, GeckoDriver и т.д.). Selenium поддерживает Go; вы запускаете процесс драйвера или подключаетесь к гриду. Используйте его для устаревших наборов или когда вам нужна самая широкая экосистема; для новых проектов на Go, chromedp или Playwright для Go часто упрощают настройку.

ZenRows - Не драйвер библиотека, а Scraper API (и опциональный Scraping Browser), который вы вызываете из Go через HTTP. ZenRows обрабатывает headless браузеры, JS рендеринг, резиденциальные прокси, анти-бот обход и CAPTCHA. Используйте его, когда ваша цель - скрейпинг и вы сталкиваетесь с блоками или лимитами скорости; для локальных E2E тестов, chromedp или Playwright обычно достаточно.

Для быстрого справочника по инструментам и структуре Go, см. Go Project Structure: Practices & Patterns; размещение автоматизации в отдельном пакете хорошо сочетается с internal/ или pkg/.

chromedp: чистый Go, только Chrome

chromedp не требует сторонних бинарных файлов: он реализует CDP на Go и запускает (или подключается к) 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 работает headless. Чтобы показать окно или изменить флаги, используйте пользовательский аллокатор (см. пример ExecAllocator chromedp). Для Docker или CI, изображение chromedp/headless-shell предоставляет более компактную сборку headless Chrome, которую chromedp может использовать из коробки, поэтому вы можете запускать chromedp в headless средах без установки Chrome на хост.

Больше примеров (скриншоты, PDF, формы, куки) в репозитории chromedp/examples.

Playwright для Go: кросс-браузер, автоматическое ожидание

Playwright для 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("не удалось запустить playwright: %v", err)
	}
	defer pw.Stop()

	browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{Headless: playwright.Bool(true)})
	if err != nil {
		log.Fatalf("не удалось запустить Chromium: %v", err)
	}
	defer browser.Close()

	page, err := browser.NewPage()
	if err != nil {
		log.Fatalf("не удалось создать страницу: %v", err)
	}

	_, err = page.Goto("https://example.com")
	if err != nil {
		log.Fatalf("не удалось перейти: %v", err)
	}

	_, err = page.Screenshot(playwright.PageScreenshotOptions{Path: playwright.String("example.png")})
	if err != nil {
		log.Fatalf("не удалось сделать скриншот: %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 для Go как для веб-скрейпинга, так и для тестирования: навигация, клики, извлечение HTML или текста, и опционально управление Scraping Browser ZenRows через его совместимый с CDP/Playwright конечный пункт, когда вам нужны анти-бот или прокси.

Selenium (Go клиент)

API WebDriver Selenium доступен в Go через клиенты сообщества (например, tebeka/selenium). Вы запускаете драйвер браузера (ChromeDriver, GeckoDriver) или подключаетесь к гриду; код на Go отправляет команды WebDriver. Так что да, Selenium поддерживает Go - вам просто нужно управлять процессом драйвера или использовать облачный грид.

Пример: подключение к ChromeDriver, навигация, получение заголовка. Драйвер должен быть запущен (например, chromedriver --port=4444 или Selenium Manager в 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)
}

Для новых проектов на Go, chromedp (без драйвера) или Playwright для Go (многобраузер, автоматическое ожидание) часто проще; используйте Selenium, если у вас уже есть наборы WebDriver или вам нужен конкретный грид.

ZenRows: Scraper API из Go

ZenRows предоставляет Scraper API (HTTP) и опциональный Scraping Browser (совместимый с CDP/Playwright). Из Go вы обычно используете Scraper API: отправляете GET (или POST) с целевым URL и параметрами; ZenRows возвращает отрендеренный HTML или другие форматы. Нет локального браузера для управления. Используйте ZenRows, когда цель - скрейпинг и вам нужны прокси, анти-бот обход или обработка CAPTCHA; для простой локальной автоматизации, chromedp или Playwright достаточно.

Установите официальный Go SDK:

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

Пример: простой GET с ZenRows Scraper API. Установите ваш 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("Длина тела:", len(response.Body()))
	fmt.Println("Статус:", 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 для Go: Поддержка нескольких браузеров, автоматическое ожидание, удобство для тестирования. Используйте для E2E тестов или когда вам нужен один API для Chromium, Firefox и WebKit; также подходит для парсинга.
  • Selenium (Go): WebDriver из Go; требуется драйвер или грид. Используйте при поддержке существующих Selenium-суит или когда нужен конкретный грид.
  • ZenRows: API парсера (и Парсинговый браузер) из Go. Используйте, когда парсинг является основной задачей и вам нужна устойчивость к блокировкам, лимитам и анти-бот системам.

Для дополнительных практик Go, линтеров, структуры проекта и инъекции зависимостей см. Go Linters: Essential Tools for Code Quality, Dependency Injection in Go: Patterns & Best Practices, и Go Cheatsheet. Если вы сочетаете автоматизацию браузера с LLM-пайплайнами в Go, то Go SDKs для Ollama и Reranking с Ollama и Qwen3 Embedding в Go являются полезными справочниками.

Связанные статьи