[go] Go 언어로 스파이더링 개발하기

스파이더링은 웹 페이지를 자동으로 크롤링하고 데이터를 수집하는 프로세스입니다. Go 언어는 간단하고 가독성이 높으며 병행성을 지원하는 특징이 있어 스파이더링 개발에 이상적인 선택입니다. 이번 블로그 포스트에서는 Go 언어를 사용하여 스파이더링을 개발하는 방법에 대해 알아보겠습니다.

1. Go 언어로 HTTP 요청 보내기

스파이더링을 개발하기 위해 먼저 웹 페이지에 HTTP 요청을 보내야 합니다. Go 언어에서는 net/http 패키지를 사용하여 이를 구현할 수 있습니다. 아래는 Go 언어로 HTTP GET 요청을 보내는 간단한 예제입니다.

package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    url := "https://www.example.com"
    resp, err := http.Get(url)
    if err != nil {
        fmt.Println("HTTP GET request failed:", err)
        return
    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response body:", err)
        return
    }

    fmt.Println(string(body))
}

이 예제에서는 http.Get 함수를 사용하여 주어진 URL의 HTML을 가져옵니다. 가져온 HTML은 ioutil.ReadAll 함수를 사용하여 바이트 슬라이스로 읽고, 이를 문자열로 변환하여 출력합니다.

2. Go 언어로 HTML 파싱하기

다음 단계는 가져온 HTML을 파싱하여 원하는 데이터를 추출하는 것입니다. Go 언어에서는 golang.org/x/net/html 패키지를 사용하여 HTML 파싱을 구현할 수 있습니다. 아래는 Go 언어로 HTML을 파싱하여 제목 태그(<h1>)를 추출하는 예제입니다.

package main

import (
    "fmt"
    "net/http"
    "io/ioutil"

    "golang.org/x/net/html"
)

func main() {
    url := "https://www.example.com"
    resp, err := http.Get(url)
    if err != nil {
        fmt.Println("HTTP GET request failed:", err)
        return
    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response body:", err)
        return
    }

    doc, err := html.Parse(bytes.NewReader(body))
    if err != nil {
        fmt.Println("Error parsing HTML:", err)
        return
    }

    var parseHTML func(*html.Node)
    parseHTML = func(n *html.Node) {
        if n.Type == html.ElementNode && n.Data == "h1" {
            fmt.Println(n.FirstChild.Data)
        }
        for c := n.FirstChild; c != nil; c = c.NextSibling {
            parseHTML(c)
        }
    }

    parseHTML(doc)
}

이 예제에서는 html.Parse 함수를 사용하여 파싱된 HTML을 얻고, 재귀적으로 탐색하며 제목 태그(<h1>)를 추출하여 출력합니다.

3. Go 언어로 데이터 저장하기

마지막 단계는 추출한 데이터를 저장하는 것입니다. Go 언어에서는 다양한 방법으로 데이터를 저장할 수 있습니다. 예를 들어, 추출한 데이터를 데이터베이스에 저장하거나 CSV 파일로 저장할 수 있습니다.

// 데이터베이스 연결 설정
db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")
if err != nil {
    fmt.Println("Error connecting to database:", err)
    return
}
defer db.Close()

// 데이터 INSERT 쿼리 실행
stmt, err := db.Prepare("INSERT INTO data (title) VALUES (?)")
if err != nil {
    fmt.Println("Error preparing INSERT statement:", err)
    return
}
defer stmt.Close()

_, err = stmt.Exec(title)
if err != nil {
    fmt.Println("Error executing INSERT statement:", err)
    return
}

위 예제는 추출한 제목을 MySQL 데이터베이스에 저장하는 방법을 보여줍니다. database/sql 패키지를 사용하여 데이터베이스와 연결하고, Prepare 함수를 사용하여 INSERT 쿼리를 준비한 뒤, Exec 함수로 쿼리를 실행하여 데이터를 데이터베이스에 저장합니다.

결론

Go 언어를 사용하여 스파이더링을 개발하는 방법에 대해 알아봤습니다. Go 언어는 강력한 표준 라이브러리와 사용하기 쉬운 문법을 제공하여 웹 크롤링과 데이터 수집 작업을 간단하게 구현할 수 있습니다. 기능을 추가하여 복잡한 스파이더링 애플리케이션을 개발할 수도 있으니, 자세한 내용은 Go 문서를 참고하시기 바랍니다.