Automação de Navegador em Go: Selenium, chromedp, Playwright, ZenRows

Selenium, chromedp, Playwright, ZenRows - em Go.

Conteúdo da página

Escolher a pilha correta de automatização do navegador e web scraping em Go afeta a velocidade, a manutenção e onde o seu código será executado.

Este resumo compara chromedp, Playwright for Go, Selenium (cliente Go) e ZenRows com exemplos de código para cada um, para que você possa escolher a melhor opção para scraping, testes E2E ou automação programada.

laptop sobre a mesa de madeira com vscode

TL;DR - Comparação rápida

Ferramenta Escopo do navegador Runtime Melhor para
chromedp Chrome/Chromium Puro Go, sem servidor Scraping, automação leve
Playwright Go Chromium, Firefox, WebKit Binários do Playwright Testes E2E, multi-navegador, scraping
Selenium (Go) Qualquer WebDriver Driver ou grid Suítes legadas, ecossistema amplo
ZenRows Nuvem (API/Navegador) HTTP do Go Scraping com proxies/anti-bot

Quando usar cada uma

chromedp - Biblioteca idiomática em Go que controla Chrome/Chromium via Chrome DevTools Protocol (CDP). Não precisa de WebDriver ou servidor do Selenium; não há runtime externo. Ideal para scraping e automação leve quando o uso exclusivo do Chrome é aceitável. A principal diferença em relação ao Playwright for Go é que o chromedp é puro Go e suporta apenas o Chrome, enquanto o Playwright suporta múltiplos navegadores e exige a instalação de binários do navegador.

Playwright for Go - Bindings de Go mantidos pela comunidade para Microsoft Playwright. Uma API para Chromium, Firefox e WebKit; aguarda automaticamente elementos; seletores e funcionalidades modernos. Use-o quando você precisar de testes E2E multi-navegador ou uma API focada em testes e estiver disposto a fazer uma instalação extra para os navegadores.

Selenium (Go) - Abordagem clássica do WebDriver: um cliente Go se comunica com um driver de navegador (ChromeDriver, GeckoDriver, etc.). O Selenium suporta Go; você executa um processo do driver ou conecta-se a uma grade. Use-o para suítes legadas ou quando precisar do ecossistema mais amplo; para novos projetos em Go, o chromedp ou o Playwright for Go geralmente simplificam a configuração.

ZenRows - Não é uma biblioteca de driver, mas uma API de Scraping (e opcionalmente um Browser de Scraping) que você chama do Go via HTTP. O ZenRows lida com navegadores headless, renderização de JS, proxies residenciais, bypass de anti-bot e CAPTCHA. Use-o quando o objetivo for scraping e você encontrar bloqueios ou limites de taxa; para testes E2E locais, o chromedp ou o Playwright geralmente são suficientes.

Para uma referência rápida sobre ferramentas e estrutura do Go, veja Estrutura de Projetos Go: Práticas & Padrões; manter a automação em um pacote dedicado se encaixa bem com internal/ ou pkg/.

chromedp: puro Go, apenas Chrome

O chromedp não requer binários de terceiros: ele implementa o CDP em Go e inicia (ou conecta-se) ao Chrome/Chromium. Instale:

go get -u github.com/chromedp/chromedp

Exemplo: navegar, ler título e extrair texto por seletor. Todas as ações são executadas dentro de chromedp.Run; use chromedp.ByQuery para seletores 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("Título:", title)
	fmt.Println("Título da seção:", bodyText)
}

Exemplo: clicar e ler o HTML atualizado. Use chromedp.Click e chromedp.OuterHTML (ou chromedp.InnerHTML) com chromedp.ByQuery. Substitua targetURL pela sua página (por exemplo, um servidor de teste ou qualquer 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),
	)

Por padrão, o Chrome executa headless. Para mostrar uma janela ou alterar flags, use um alocador personalizado (veja o exemplo de ExecAllocator do chromedp). Para Docker ou CI, a imagem chromedp/headless-shell fornece uma construção de Chrome headless menor que o chromedp pode usar diretamente – assim, você pode executar o chromedp em ambientes headless sem instalar o Chrome no host.

Mais exemplos (capturas de tela, PDFs, formulários, cookies) estão no repositório chromedp/examples.

Playwright for Go: multi-navegador, auto-aguarda

O Playwright for Go oferece as mesmas funcionalidades de múltiplos navegadores e auto-aguarda do Playwright em outras linguagens. Instale a biblioteca e, em seguida, os binários do navegador:

go get -u github.com/playwright-community/playwright-go
go run github.com/playwright-community/playwright-go/cmd/playwright@latest install --with-deps

Exemplo: iniciar o Chromium, abrir uma página, capturar uma imagem. Você pode usar pw.Firefox ou pw.WebKit para outros motores.

package main

import (
	"log"

	"github.com/playwright-community/playwright-go"
)

func main() {
	pw, err := playwright.Run()
	if err != nil {
		log.Fatalf("não foi possível iniciar o Playwright: %v", err)
	}
	defer pw.Stop()

	browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{Headless: playwright.Bool(true)})
	if err != nil {
		log.Fatalf("não foi possível iniciar o Chromium: %v", err)
	}
	defer browser.Close()

	page, err := browser.NewPage()
	if err != nil {
		log.Fatalf("não foi possível criar a página: %v", err)
	}

	_, err = page.Goto("https://example.com")
	if err != nil {
		log.Fatalf("não foi possível acessar a página: %v", err)
	}

	_, err = page.Screenshot(playwright.PageScreenshotOptions{Path: playwright.String("example.png")})
	if err != nil {
		log.Fatalf("não foi possível capturar a imagem: %v", err)
	}
}

Exemplo: preencher um formulário e obter o texto. O Playwright aguarda automaticamente elementos para serem ações, reduzindo a instabilidade em comparação com o CDP bruto ou o Selenium sem waits explícitos.

	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)

Você pode usar o Playwright for Go tanto para scraping quanto para testes: navegar, clicar, extrair HTML ou texto, e opcionalmente controlar o Scraping Browser do ZenRows via seu endpoint compatível com CDP/Playwright quando precisar de anti-bot ou proxies.

Selenium (cliente Go)

A API do WebDriver do Selenium está disponível em Go via clientes comunitários (ex: tebeka/selenium). Você executa um driver de navegador (ChromeDriver, GeckoDriver) ou conecta-se a uma grade; o código Go envia comandos do WebDriver. Sim, o Selenium suporta Go – você só precisa gerenciar o processo do driver ou usar uma grade de nuvem.

Exemplo: conectar-se ao ChromeDriver, navegar, obter o título. O driver deve estar em execução (ex: chromedriver --port=4444 ou Selenium Manager no 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("Título:", title)
}

Para novos projetos em Go, o chromedp (sem driver) ou o Playwright for Go (multi-navegador, auto-aguarda) geralmente são mais fáceis; use o Selenium quando já tiver suites de WebDriver ou precisar de uma grade específica.

ZenRows: API de Scraping do Go

O ZenRows expõe uma API de Scraping (HTTP) e um Browser de Scraping opcional (compatível com CDP/Playwright). Do Go, você normalmente usa a API de Scraping: envie um GET (ou POST) com a URL do alvo e as opções; o ZenRows retorna o HTML renderizado ou outros formatos. Não há navegador local para gerenciar. Use o ZenRows quando o objetivo for scraping e você precisar de proxies, bypass de anti-bot ou tratamento de CAPTCHA; para automação local simples, o chromedp ou o Playwright são suficientes.

Instale o SDK oficial do Go:

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

Exemplo: GET simples com a API de Scraping do ZenRows. Defina sua chave API via cliente ou variável de ambiente 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("SUA_CHAVE_API"),
	)

	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("Tamanho do corpo:", len(response.Body()))
	fmt.Println("Status:", response.Status())
}

Exemplo: renderização de JS e proxies premium. Personalize o comportamento com 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()

O SDK suporta limites de concorrência (WithMaxConcurrentRequests), retenções (WithMaxRetryCount, WithRetryWaitTime) e outras opções; veja as documentações do SDK do ZenRows Scraper API para Go.

Resumo

  • chromedp: Puro Go, CDP, apenas Chrome; sem driver. Use para automação e scraping rápidos com baixo custo. Execute em Docker com chromedp/headless-shell se necessário.
  • Playwright for Go: Multi-navegador, auto-aguarda, amigável para testes. Use para testes E2E ou quando quiser uma API única para Chromium, Firefox e WebKit; também adequado para scraping.
  • Selenium (Go): WebDriver do Go; driver ou grade necessários. Use quando estiver mantendo suites existentes de Selenium ou precisar de uma grade específica.
  • ZenRows: API de Scraping (e Browser de Scraping) do Go. Use quando o objetivo for scraping e você precisar de resiliência contra bloqueios, limites de taxa e anti-bot.

Para mais práticas de Go – linters, layout de projeto e injeção de dependência – veja Linters para Go: Ferramentas Essenciais para Qualidade do Código, Injeção de Dependência em Go: Padrões & Boas Práticas, e o Cheatsheet de Go. Se você combinar automação de navegador com pipelines de LLM em Go, os SDKs do Ollama para Go e Reordenação com Ollama e Qwen3 Embedding em Go são referências úteis.

Posts relacionados