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

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 являются полезными справочниками.
Связанные статьи
- Go Cheatsheet
- Go Linters: Essential Tools for Code Quality
- Go Project Structure: Practices & Patterns
- Dependency Injection in Go: Patterns & Best Practices
- Go SDKs для Ollama - сравнение с примерами
- Переранжирование текстовых документов с Ollama и моделью Qwen3 Embedding - на Go
- chromedp - Go пакет
- Примеры chromedp
- Playwright для Go
- playwright-go GitHub
- ZenRows Scraper API Go SDK
- Документация ZenRows
- Chrome DevTools Protocol