본문 바로가기
Programming/Golang

Go언어 chromedp 라이브러리로 웹 크롤링하기

by Wilkyway 2021. 1. 11.
반응형

오늘은 웹 크롤링에 대해 알아보겠습니다.

go언어에서의 웹 크롤링에도 selenium과 chrome webdvier를 사용하는 방법이 있지만, selenium 개발하신 분이 현재는 관리를 중단한 상태라고 합니다. 대신 chromedp를 주로 사용한다고 합니다. 간략하게 chromedp를 알아보겠습니다.

 

우선 설치는 일반적인 go 라이브러리들과 마찬가지로 go get 명령으로 설치합니다. (깃헙링크)

go get -u github.com/chromedp/chromedp

그리고 예제는 여기링크로 가면 여러가지를 확인할 수 있습니다만, 천천히 살펴보시고

주요 method에 대한 예시로 아래 코드를 남겨놓겠습니다. (아래 코드는 실행되지는 않습니다. 추후 간단한 실행가능 예시로 업데이트 하겠습니다.)

 
package main

import (
	"context"
	"fmt"
	_ "log"
	"time"

	"github.com/chromedp/cdproto/runtime"
	"github.com/chromedp/chromedp"
)

func main() {

	// chrome 실행 옵션 설정
	opts := append(chromedp.DefaultExecAllocatorOptions[:],
		chromedp.DisableGPU,		
		chromedp.Flag("headless", false),	//headless를 false로 하면 브라우저가 뜨고, true로 하면 브라우저가 뜨지않는 headless 모드로 실행됨. 기본값은 true.
	)

	contextVar, cancelFunc := chromedp.NewExecAllocator(context.Background(), opts...)
	defer cancelFunc()

	contextVar, cancelFunc = chromedp.NewContext(contextVar)
	defer cancelFunc()

	// setting 필요 없이 headless 모드로 실행할 경우 아래의 코드로 대체 가능
	// contextVar, cancelFunc := chromedp.NewContext(
	// 	context.Background(),
	// 	chromedp.WithLogf(log.Printf),
	// )
	//defer cancelFunc()

	contextVar, cancelFunc = context.WithTimeout(contextVar, 50*time.Second)	// timeout 값을 설정 
	defer cancelFunc()

	var strVar string
	err := chromedp.Run(contextVar,

		chromedp.Navigate(`https://www.google.com/`),	// 시작 URL
		chromedp.WaitVisible(`body`),		//body 요소를 모두 불러들일 때까지 대기
		chromedp.InnerHTML(`pre`, &strVar),	// pre 태그의 내부 텍스트를 strVar변수에 입력
        	chromedp.OuterHTML(`div.srch_employees__list`, &strVar),	// 태크와 그 내부 텍스트를 함께 strVar변수에 입력
		chromedp.Click(`.employees-open`, chromedp.NodeVisible),	// .employees-open 클래스의 요소를 클릭
		chromedp.Sleep(10*time.Second),		//10초간 대기
		chromedp.SetAttributeValue(`input#empSearchKeyWord`, "value", "홍길동", chromedp.NodeVisible),	//input의 value에 '홍길동'을 입력 
		chromedp.SetAttributes(`input#empSearchKeyWord`, map[string]string{"value": "12345678"}, chromedp.NodeVisible), //input에 value 속성을 추가하고 값을 대입함 
		chromedp.SendKeys(`input#empSearchKeyWord`, "a"),	//키 입력
		chromedp.Evaluate(`window.open('www.naver.com')`, &strVar),	//javascript 실행
		chromedp.Value(`div#executiveStatusPop > div.dialog__contents > div.srch_employees > div.srch_employees__container > div.employees__srch > div._fr > div.board-search > input#empSearchKeyWord label`, &strVar),	// 해당 요소의 텍스트값을 취하여 strVar변수에 대입 
	)
	if err != nil {
		panic(err)
	}
}

 

그럼 이만~~

 

 
 
 
반응형

댓글