L'automatisation du navigateur en Go : Selenium, chromedp, Playwright, ZenRows

Selenium, chromedp, Playwright, ZenRows - en Go.

Sommaire

Le choix de la bonne stack d’automatisation du navigateur et webscraping en Go affecte la vitesse, la maintenance et l’endroit où votre code s’exécute.

Ce résumé compare chromedp, Playwright for Go, Selenium (client Go) et ZenRows avec des exemples de code pour chacun afin que vous puissiez choisir l’option la plus adaptée au webscraping, aux tests E2E ou à l’automatisation planifiée.

ordinateur portable sur la table en bois avec vscode

TL;DR - Comparaison rapide

Outil Portée du navigateur Exécution Meilleur pour
chromedp Chrome/Chromium Pure Go, aucun serveur Scraping, automatisation légère
Playwright Go Chromium, Firefox, WebKit Binaires Playwright Tests E2E, multinavigateur, scraping
Selenium (Go) Tout WebDriver Driver ou grille Suites héritées, écosystème large
ZenRows Cloud (API/Navigateur) HTTP depuis Go Scraping avec proxys/anti-bot

Quand utiliser lequel

chromedp - Bibliothèque idiomatique Go qui pilote Chrome/Chromium via le Chrome DevTools Protocol (CDP). Aucun WebDriver ou serveur Selenium ; aucun runtime externe. Idéal pour le scraping et l’automatisation légère lorsque l’utilisation de Chrome uniquement est acceptable. La principale différence avec Playwright for Go est que chromedp est pure Go et Chrome uniquement, tandis que Playwright prend en charge plusieurs navigateurs et nécessite l’installation des binaires de navigateur.

Playwright for Go - Liens Go communautaires pour Microsoft Playwright. Une seule API pour Chromium, Firefox et WebKit ; attente automatique des éléments ; sélecteurs et fonctionnalités modernes. Utilisez-le lorsque vous avez besoin de tests E2E multinavigateur ou d’une API orientée test et que vous êtes d’accord avec une étape supplémentaire d’installation des navigateurs.

Selenium (Go) - L’approche classique WebDriver : un client Go communique avec un pilote de navigateur (ChromeDriver, GeckoDriver, etc.). Selenium prend en charge Go ; vous exécutez un processus de pilote ou vous vous connectez à une grille. Utilisez-le pour les suites héritées ou lorsque vous avez besoin de l’écosystème le plus large ; pour de nouveaux projets Go, chromedp ou Playwright for Go simplifient souvent l’installation.

ZenRows - Ce n’est pas une bibliothèque de pilote mais un Scraper API (et un navigateur de scraping optionnel) que vous appelez depuis Go via HTTP. ZenRows gère les navigateurs headless, le rendu JS, les proxys résidentiels, le contournement anti-bot et les CAPTCHA. Utilisez-le lorsque votre objectif est le scraping et que vous rencontrez des blocages ou des limites de taux ; pour les tests E2E locaux, chromedp ou Playwright sont généralement suffisants.

Pour un référentiel rapide des outils Go et de la structure, consultez Go Project Structure: Practices & Patterns; placer l’automatisation dans un package dédié s’intègre bien avec internal/ ou pkg/.

chromedp : pure Go, Chrome uniquement

chromedp n’exige aucun binaires tiers : il implémente le CDP en Go et lance (ou se connecte à) Chrome/Chromium. Installation :

go get -u github.com/chromedp/chromedp

Exemple : naviguer, lire le titre et extraire le texte par sélecteur. Toutes les actions s’exécutent à l’intérieur de chromedp.Run ; utilisez chromedp.ByQuery pour les sélecteurs 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("Titre :", title)
	fmt.Println("En-tête :", bodyText)
}

Exemple : cliquer et lire le HTML mis à jour. Utilisez chromedp.Click et chromedp.OuterHTML (ou chromedp.InnerHTML) avec chromedp.ByQuery. Remplacez targetURL par votre page (par exemple, un serveur de test ou tout 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),
	)

Par défaut, Chrome s’exécute en headless. Pour afficher une fenêtre ou changer les paramètres, utilisez un allocateur personnalisé (voir l’exemple chromedp ExecAllocator). Pour Docker ou CI, l’image chromedp/headless-shell fournit une version headless de Chrome plus petite que chromedp peut utiliser directement – vous pouvez ainsi exécuter chromedp dans des environnements headless sans installer Chrome sur l’hôte.

D’autres exemples (captures d’écran, PDF, formulaires, cookies) sont disponibles dans le dépôt chromedp/examples.

Playwright for Go : multinavigateur, attente automatique

Playwright for Go vous offre les mêmes fonctionnalités de multinavigateur et d’attente automatique que Playwright dans d’autres langages. Installez la bibliothèque puis les binaires de navigateur :

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

Exemple : lancer Chromium, ouvrir une page, prendre une capture d’écran. Vous pouvez utiliser pw.Firefox ou pw.WebKit pour d’autres moteurs.

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)
	}
}

Exemple : remplir un formulaire et obtenir du texte. Playwright attend automatiquement les éléments pour être actionnables, ce qui réduit la fragilité par rapport à CDP brute ou à Selenium sans attentes explicites.

	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)

Vous pouvez utiliser Playwright for Go pour le webscraping ainsi que pour les tests : naviguer, cliquer, extraire du HTML ou du texte, et éventuellement piloter le navigateur de scraping de ZenRows via son point d’accès CDP/Playwright compatible lorsqu’il vous faut des proxys ou un contournement anti-bot.

Selenium (client Go)

L’API WebDriver de Selenium est disponible en Go via des clients communautaires (ex. tebeka/selenium). Vous exécutez un pilote de navigateur (ChromeDriver, GeckoDriver) ou vous vous connectez à une grille ; le code Go envoie des commandes WebDriver. Oui, Selenium prend en charge Go – vous avez juste besoin de gérer le processus du pilote ou d’utiliser une grille cloud.

Exemple : se connecter à ChromeDriver, naviguer, obtenir le titre. Le pilote doit être en cours d’exécution (ex. chromedriver --port=4444 ou Selenium Manager en 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("Titre :", title)
}

Pour de nouveaux projets Go, chromedp (sans pilote) ou Playwright for Go (multinavigateur, attente automatique) sont souvent plus simples ; utilisez Selenium lorsque vous avez déjà des suites WebDriver ou que vous avez besoin d’une grille spécifique.

ZenRows : Scraper API depuis Go

ZenRows expose un Scraper API (HTTP) et un navigateur de scraping optionnel (compatible CDP/Playwright). Depuis Go, vous utilisez généralement le Scraper API : envoyez une requête GET (ou POST) avec l’URL cible et les options ; ZenRows renvoie le HTML rendu ou d’autres formats. Aucun navigateur local à gérer. Utilisez ZenRows lorsque le scraping est l’objectif et que vous avez besoin de proxys, de contournement anti-bot ou de gestion des CAPTCHA ; pour une automatisation locale simple, chromedp ou Playwright sont suffisants.

Installez le SDK Go officiel :

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

Exemple : requête GET simple avec l’API Scraper de ZenRows. Définissez votre clé API via le client ou la variable d’environnement 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("Longueur du corps :", len(response.Body()))
	fmt.Println("Statut :", response.Status())
}

Exemple : rendu JS et proxys premium. Personnalisez le comportement avec 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()

Le SDK prend en charge les limites de concurrence (WithMaxConcurrentRequests), les réessais (WithMaxRetryCount, WithRetryWaitTime) et d’autres options ; consultez les docs du SDK ZenRows Scraper API Go.

Résumé

  • chromedp : Pure Go, CDP, Chrome uniquement ; aucun pilote. Utilisez-le pour une automatisation et un scraping rapides et à faible surcharge. Exécutez-le en Docker avec chromedp/headless-shell si nécessaire.
  • Playwright for Go : Multinavigateur, attente automatique, test-friendly. Utilisez-le pour les tests E2E ou lorsque vous souhaitez une seule API pour Chromium, Firefox et WebKit ; également adapté au scraping.
  • Selenium (Go) : WebDriver depuis Go ; pilote ou grille requis. Utilisez-le lors de la maintenance de suites Selenium existantes ou lorsque vous avez besoin d’une grille spécifique.
  • ZenRows : Scraper API (et navigateur de scraping) depuis Go. Utilisez-le lorsque le scraping est l’objectif et que vous avez besoin de résilience face aux blocages, limites de taux et anti-bot.

Pour plus de pratiques Go – linters, dispositions de projet et injection de dépendances – consultez Go Linters: Essential Tools for Code Quality, Dependency Injection in Go: Patterns & Best Practices, et le Go Cheatsheet. Si vous combinez l’automatisation des navigateurs avec des pipelines LLM en Go, les SDKs Go pour Ollama et Reranking avec Ollama et Qwen3 Embedding en Go sont des références utiles.

Articles connexes