Go에서의 브라우저 자동화: Selenium, chromedp, Playwright, ZenRows
셀레니움, 크롬디피, 플레이와이트, 린로우즈 - 고에서.
올바른 브라우저 자동화 스택과 Go를 사용한 웹 스크래핑([https://www.glukhov.org/ko/post/2026/02/browser-automation-in-go-scraping-selenium-playwright-alternatives/ “브라우저 자동화 스택 및 Go를 사용한 웹 스크래핑”)을 선택하는 것은 속도, 유지보수, 그리고 코드가 실행되는 위치에 영향을 미칩니다.
이 개요는 chromedp, Playwright for Go, Selenium (Go 클라이언트), ZenRows의 각각에 대한 코드 예제를 포함하여 스크래핑, E2E 테스트, 또는 예약된 자동화에 가장 적합한 것을 선택할 수 있도록 비교합니다.

TL;DR - 간단한 비교
| 도구 | 브라우저 범위 | 런타임 | 가장 적합한 용도 |
|---|---|---|---|
| chromedp | Chrome/Chromium | 순수 Go, 서버 없음 | 스크래핑, 가벼운 자동화 |
| Playwright Go | Chromium, Firefox, WebKit | Playwright 바이너리 | E2E 테스트, 크로스 브라우저, 스크래핑 |
| Selenium (Go) | 모든 WebDriver | 드라이버 또는 그리드 | 기존 시스템, 넓은 생태계 |
| ZenRows | 클라우드 (API/브라우저) | Go에서의 HTTP 요청 | 프록시/항거봇을 사용한 스크래핑 |
언제 어떤 것을 사용해야 하는가
chromedp - Chrome/Chromium을 Chrome DevTools Protocol (CDP)를 통해 조작하는 Go의 고유한 라이브러리입니다. WebDriver 또는 Selenium 서버가 필요하지 않으며 외부 런타임도 필요하지 않습니다. Chrome만 사용할 수 있는 경우 스크래핑 및 가벼운 자동화에 이상적입니다. Playwright for Go와의 주요 차이점은 chromedp가 순수 Go이며 Chrome만 지원하는 반면, Playwright는 여러 브라우저를 지원하고 브라우저 바이너리 설치가 필요합니다.
Playwright for Go - Microsoft Playwright에 대한 커뮤니티 유지 관리 Go 바인딩입니다. Chromium, Firefox, WebKit을 위한 하나의 API; 요소에 대한 자동 대기; 현대적인 선택자 및 기능. 크로스 브라우저 E2E 테스트 또는 테스트 중심 API가 필요할 때 사용하며, 브라우저 설치를 위한 추가 단계가 허용됩니다.
Selenium (Go) - 고전적인 WebDriver 접근 방식: Go 클라이언트가 브라우저 드라이버 (ChromeDriver, GeckoDriver 등)와 통신합니다. Selenium은 Go를 지원하며, 드라이버 프로세스를 실행하거나 그리드에 연결합니다. 기존 시스템을 유지하거나 가장 넓은 생태계가 필요한 경우 사용하며, 새 Go 프로젝트에서는 chromedp 또는 Playwright for Go가 일반적으로 설정을 더 간단하게 만듭니다.
ZenRows - 드라이버 라이브러리가 아닌 Scraper API (및 선택적 Scraping Browser)로, Go에서 HTTP를 통해 호출합니다. ZenRows는 헤드리스 브라우저, JS 렌더링, 주거용 프록시, 항거봇 우회, CAPTCHA를 처리합니다. 스크래핑이 목적이며 블록이나 요청 제한에 직면할 때 사용하며, 로컬 E2E 테스트에는 일반적으로 chromedp 또는 Playwright가 충분합니다.
Go 도구 및 구조에 대한 빠른 참조는 Go 프로젝트 구조: 실천 및 패턴을 참조하십시오. 자동화를 별도의 패키지에 유지하는 것은 internal/ 또는 pkg/와 잘 어울립니다.
chromedp: 순수 Go, Chrome 전용
chromedp는 제3자 바이너리가 필요하지 않습니다: Go에서 CDP를 구현하고 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은 헤드리스로 실행됩니다. 창을 표시하거나 플래그를 변경하려면 커스텀 할로케이터를 사용하십시오 (예: chromedp ExecAllocator 예제). Docker 또는 CI 환경에서 chromedp/headless-shell 이미지를 사용하면 호스트에 Chrome을 설치하지 않고도 chromedp를 실행할 수 있습니다.
더 많은 예제 (스크린샷, PDF, 폼, 쿠키 등)는 chromedp/examples 저장소에 있습니다.
Playwright for Go: 크로스 브라우저, 자동 대기
Playwright for 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("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)
}
}
예제: 폼 작성 및 텍스트 추출. 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 for Go는 웹 스크래핑뿐만 아니라 테스트에도 사용할 수 있습니다: 네비게이트, 클릭, HTML 또는 텍스트 추출, ZenRows의 Scraping Browser를 CDP/Playwright 호환 엔드포인트를 통해 제어할 수 있습니다.
Selenium (Go 클라이언트)
Selenium의 WebDriver API는 tebeka/selenium 같은 커뮤니티 클라이언트를 통해 Go에서 사용할 수 있습니다. 브라우저 드라이버 (ChromeDriver, GeckoDriver)를 실행하거나 그리드에 연결합니다. Go 코드는 WebDriver 명령을 보냅니다. 네, Selenium은 Go를 지원합니다. 드라이버 프로세스를 관리하거나 클라우드 그리드를 사용해야 합니다.
예제: ChromeDriver에 연결, 네비게이트, 제목 가져오기. 드라이버가 실행되어 있어야 합니다 (예: chromedriver --port=4444 또는 Selenium 4의 Selenium Manager).
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 for Go (다중 브라우저, 자동 대기)가 일반적으로 더 간단하며, WebDriver 시스템이 이미 존재하거나 특정 그리드가 필요한 경우 Selenium을 사용하십시오.
ZenRows: Go에서의 Scraper API
ZenRows는 Scraper API (HTTP) 및 선택적 Scraping Browser (CDP/Playwright 호환)를 제공합니다. Go에서는 일반적으로 Scraper API를 사용합니다: 대상 URL 및 옵션을 포함한 GET (또는 POST)을 보냅니다. ZenRows는 렌더링된 HTML 또는 기타 형식을 반환합니다. 로컬 브라우저를 관리할 필요가 없습니다. 스크래핑이 목적이며 프록시, 항거봇 우회, CAPTCHA 처리가 필요한 경우 ZenRows를 사용하십시오. 간단한 로컬 자동화에는 chromedp 또는 Playwright가 충분합니다.
공식 Go SDK 설치:
go get github.com/zenrows/zenrows-go-sdk/service/api
예제: ZenRows Scraper API를 사용한 간단한 GET. 클라이언트 또는 ZENROWS_API_KEY 환경 변수를 통해 API 키를 설정하십시오.
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 for Go: 다중 브라우저, 자동 대기, 테스트 친화적. E2E 테스트 또는 Chromium, Firefox, WebKit에 대한 하나의 API가 필요한 경우 사용. 스크래핑에도 적합합니다.
- Selenium (Go): Go에서 WebDriver 사용; 드라이버 또는 그리드 필요. 기존 Selenium 시스템을 유지하거나 특정 그리드가 필요한 경우 사용.
- ZenRows: Go에서의 Scraper API (및 Scraping Browser) 사용. 스크래핑이 목적이며 블록, 요청 제한, 항거봇에 대한 내구성이 필요한 경우 사용.
Go의 더 많은 실천 사항 - 라이너, 프로젝트 레이아웃, 의존성 주입 - Go 라이너: 코드 품질을 위한 필수 도구, Go에서 의존성 주입: 패턴 및 최고 실천, 그리고 Go 체크리스트를 참조하십시오. Go에서 브라우저 자동화와 LLM 파이프라인을 결합하는 경우, Go SDKs for Ollama 및 Ollama와 Qwen3 임베딩을 사용한 재정렬 - Go가 유용한 참고 자료입니다.