본문 바로가기

프로그래밍/golang

go colly 내가 경험한 최고의 스크래핑 프레임워크

안녕하세요. k 입니다. 

python의 scrapy를 사용하려 하다가 높은 진입 장벽에 막혔습니다. (귀찮아서 그런거 아님)

requests와 beautifulsoup보다 더 쉽고 빠르게 스크래퍼를 만들 방법을 고민하다가 golang에 colly 라는 프레임워크가 있다는 말을 발견하고 사용해본 후기를 남기고자 합니다.

사용법이 워낙 간단해서 그런지 한글로 된 자료가 거의 없어서 고생 했었는데 이 글을 읽는 분들은 그러지 않기를 바랍니다. ㅎㅎ

 

0. 공식 문서

공식 문서에 예제도 많고 정말 잘 정리되어 있습니다.

http://go-colly.org/docs/

 

Documentation | Colly

Scraping framework for extracting the data you need from websites, used for a wide range of applications, like data mining, data processing or archiving

go-colly.org

a. 설치법

github.com/gocolly/colly/v2 latest

b. 문법

import (
		"fmt"
        
		"github.com/gocolly/colly"
		)


func ScrapeMK() {
	baseUrl := "https://www.mk.co.kr/news/stock/?page="
	collector := colly.NewCollector(colly.Async(true))
	collector.OnHTML("dl .article_list", func(e *colly.HTMLElement) {
		title := e.ChildText("a")
        description := e.ChildText("span .desctxt")
        fmt.Println(title, description)
	})
	for i := 0; i <= 10; i++ {
		collector.Visit(baseUrl + strconv.Itoa(i))
	}
	collector.Wait()
}

이렇게 간단한 코드로 (*비동기로 실행되는) 매일경제 뉴스 사이트의 증권파트 스크래퍼를 만들었습니다.

매우매우 빠르고 간단합니다.

반복되는 html 코드에서 OnHTML함수로 쉽게 값을 추출 할 수 있고, OnResponse 등등의 다른 함수도 직관적이며 사용하기 쉽습니다. 조금 헤매었던 부분인 child-> parent로 접근 할 때에도

e.DOM.Parents().Find("h1") 와 같은 코드를 통해서 매우 쉽게 접근 할 수 있습니다.

기본적으로 colly의 selector는 goquery 의 selector를 사용하기 때문에 쉽게 이해할 수 있을 것 같습니다.

추가로 궁금한 사항이 있으면 덧글 부탁드립니다.