>  기사  >  백엔드 개발  >  golang에서 크롤러를 작성하는 방법

golang에서 크롤러를 작성하는 방법

WBOY
WBOY원래의
2023-05-10 14:00:08892검색

인터넷의 인기로 인해 우리는 많은 양의 정보를 얻어야 하며, 그 중 상당 부분은 웹사이트에서 크롤링해야 합니다. 크롤링 방법에는 여러 가지가 있으며 그 중 golang으로 작성된 크롤러는 이 정보를 보다 효율적으로 얻는 데 도움이 될 수 있습니다.

golang은 직관적이고 간결하며 효율적인 프로그래밍 언어로 높은 동시성, 고성능 애플리케이션 시나리오에 적합하고 크롤러는 높은 동시성, 고성능 작업이므로 golang에서 크롤러를 작성하는 데 매우 적합합니다. 이 글에서는 초보자가 Golang 크롤러의 기본 방법을 빠르게 익힐 수 있도록 Golang에서 크롤러를 작성하기 위한 기본 프로세스, 일반적으로 사용되는 라이브러리 및 핵심 기술을 소개합니다.

1. golang에서 크롤러를 작성하는 기본 단계

golang에서 크롤러를 작성하는 기본 단계를 소개하기 전에 기본 HTML 구조를 이해해야 합니다.

  1. HTTP 요청

golang의 표준 라이브러리에는 HTTP 요청에 대한 관련 기능이 제공되어 있으며, URL, 요청 헤더, 쿠키, 요청 매개변수 등과 같은 기본 정보만 설정하면 필요한 HTTP를 구성할 수 있습니다. . 묻다. 주요 코드는 다음과 같습니다.

package main

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

func main() {
    resp, err := http.Get("http://www.baidu.com")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

이 코드는 http.Get 함수를 사용하여 HTTP 요청을 시작하고 응답에서 응답 본문을 읽습니다. 핵심은 응답 본문을 닫고 리소스 누출을 방지하기 위해 함수 끝에서 실행되는 defer 문입니다.

  1. HTML 페이지 구문 분석

HTTP 요청으로 얻은 응답 데이터는 HTML 문서이므로 필요한 데이터를 얻으려면 구문 분석해야 합니다. golang에서는 GoQuery 라이브러리를 사용하여 HTML 문서를 구문 분석할 수 있습니다. 이 라이브러리는 jQuery의 구문을 기반으로 하며 사용하기 쉽습니다.

GoQuery에서 제공하는 주요 파싱 기능은 Find, Filter, Each, Attr 등입니다. Find 기능은 기준에 맞는 하위 요소를 찾는 데 사용되고, Filter 기능은 기준에 맞는 요소를 필터링하는 데 사용됩니다. Each 함수는 조건을 충족하는 모든 요소를 ​​순회하는 데 사용되는 반면 Attr 함수는 요소의 속성을 가져오는 데 사용됩니다. Baidu 홈페이지를 예로 들어 분석하면 코드는 다음과 같습니다.

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "log"
)

func main() {
    resp, err := http.Get("http://www.baidu.com")
    if err != nil {
        log.Fatal(err)
    }
    body := resp.Body
    defer body.Close()

    doc, err := goquery.NewDocumentFromReader(body)
    if err != nil {
        log.Fatal(err)
    }

    doc.Find("title").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Text())
    })
}

위 코드는 goquery.NewDocumentFromReader 함수를 사용하여 문서 객체를 구성한 다음 Find 메서드를 통해 제목 요소를 찾고 Each를 통해 자격을 갖춘 모든 요소를 ​​순회합니다. 텍스트를 출력하는 방법입니다.

  1. 데이터 저장

마지막 단계는 획득한 데이터를 저장하는 것입니다. 데이터 저장의 경우 데이터베이스, 파일, 캐시 등과 같이 선택할 수 있는 다양한 방법이 있습니다.

예를 들어 크롤링된 데이터를 CSV 파일로 저장하려고 합니다. 단계는 다음과 같습니다.

package main

import (
    "encoding/csv"
    "log"
    "os"
)

func main() {
    file, err := os.Create("data.csv")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()
    
    writer.Write([]string{"name", "address", "tel"})
    writer.Write([]string{"John Smith", "123 Main St, Los Angeles, CA 90012", "123-456-7890"})
    writer.Write([]string{"Jane Smith", "456 Oak Ave, San Francisco, CA 94107", "123-456-7891"})
}

위 코드에서는 os.Create 함수를 사용하여 data.csv라는 파일을 생성합니다. csv.NewWriter 함수를 통해 data.csv라는 파일. 마지막으로 Writer.Write 메소드를 통해 저장할 데이터를 CSV 파일에 작성합니다.

2. golang에서 크롤러를 작성하는 데 일반적으로 사용되는 라이브러리

golang에서 크롤러를 작성하는 데에는 기본 코드를 많이 작성할 필요가 없습니다. 일반적인 크롤러 라이브러리는 다음과 같습니다.

  1. Gocolly

Gocolly는 가벼운 크롤러입니다. 데이터를 크롤링하는 데 도움이 되는 편리한 방법이 많이 있습니다. 리디렉션, 쿠키, 프록시, 속도 제한 등과 같은 문제를 자동으로 처리할 수 있으므로 데이터 추출 규칙 정의에 더 집중할 수 있습니다. 다음 코드는 Gocolly를 사용하여 Baidu 제목을 얻는 방법을 보여줍니다.

package main

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

func main() {
    c := colly.NewCollector()
    
    c.OnHTML("head", func(e *colly.HTMLElement) {
        title := e.ChildText("title")
        fmt.Println(title)
    })
    
    c.Visit("http://www.baidu.com")
}
  1. beautifulsoup4go

beautifulsoup4go는 인터넷에서 다양한 HTML 페이지를 구문 분석할 수 있는 유명한 Python 라이브러리 BeautifulSoup4와 동일한 golang 기반 HTML 구문 분석기입니다. 다음 코드는 Baidu 타이틀을 얻기 위해 beautifulsoup4go를 사용하는 방법을 보여줍니다.

package main

import (
    "fmt"
    "github.com/sundy-li/go_commons/crawler"
)

func main() {
    html := crawler.FetchHTML("http://www.baidu.com", "GET", nil, "")

    bs := crawler.NewSoup(html)

    title := bs.Find("title").Text()
    
    fmt.Println(title)
}
  1. goquery

goquery 라이브러리는 이전에 소개된 CSS 선택기를 기반으로 하는 HTML 파서이며 체인 작업을 지원합니다. 도서관. 다음 코드는 goquery를 사용하여 Baidu 타이틀을 얻는 방법을 보여줍니다.

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "log"
)

func main() {
    resp, err := http.Get("http://www.baidu.com")
    if err != nil {
        log.Fatal(err)
    }
    body := resp.Body
    defer body.Close()

    doc, err := goquery.NewDocumentFromReader(body)
    if err != nil {
        log.Fatal(err)
    }

    title := doc.Find("title").Text()
    
    fmt.Println(title)
}

위의 세 라이브러리는 각각 고유한 특성을 가지고 있습니다. 자신에게 맞는 라이브러리를 선택하면 크롤러를 더 효율적으로 완료할 수 있습니다.

3. 크롤러 작성을 위한 Golang 핵심 기술

  1. 동시성

크롤러 구현 과정에서 매우 중요한 기능은 동시성, 즉 동시에 여러 웹 사이트 또는 여러 URL에 액세스하는 것입니다. golang에서는 코루틴을 통해 작업을 동시에 수행할 수 있습니다. 예:

package main

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

func main() {
    urls := []string{
        "http://www.baidu.com",
        "http://www.sogou.com",
        "http://www.google.com",
    }

    ch := make(chan string, len(urls))

    for _, url := range urls {
        go func(url string) {
            c := colly.NewCollector()

            c.OnHTML("head", func(e *colly.HTMLElement) {
                title := e.ChildText("title")
                ch <- title
            })

            c.Visit(url)
        }(url)
    }

    for range urls {
        title := <-ch
        fmt.Println(title)
    }
}

위 코드에서는 코루틴을 사용하여 여러 URL에 동시에 액세스하고 각 웹사이트의 헤드 태그에서 제목 정보를 추출하여 인쇄합니다.

  1. 크롤러 방지 메커니즘

우리 모두 알고 있듯이 크롤러 액세스를 제한하기 위해 많은 웹사이트에서는 요청 빈도 제한, 확인 코드 추가, 일반 크롤러 도구 식별 등과 같은 크롤러 방지 메커니즘을 채택합니다. 이러한 크롤러 방지 메커니즘의 경우 웹 사이트가 차단되는 것을 방지하기 위해 몇 가지 기술적 수단을 사용해야 합니다. 두 가지 기술적 수단은 다음과 같습니다.

(1) 접근 빈도 제어

웹 사이트에 의한 제한을 피하기 위해 접근 간격 설정, 프록시 IP 사용, 분산 방법 사용 등을 사용하여 안티에 의해 차단되는 것을 피할 수 있습니다. 크롤러 메커니즘 식별.

예를 들어 Gocolly 프레임워크에서는 WaitTime, RandomDelay 및 Limit과 같은 메소드를 사용하여 크롤링 빈도 및 요청 제한을 설정할 수 있습니다.

package main

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

func main() {
    c := colly.NewCollector()

    c.Limit(&colly.LimitRule{
        DomainGlob:  "*",
        Parallelism: 2,
        RandomDelay: 5 * time.Second,
    })

    c.OnHTML("head", func(e *colly.HTMLElement) {
        title := e.ChildText("title")
        fmt.Println(title)
    })

    c.Visit("http://www.baidu.com")
}

위 코드에서 동시 액세스 수는 2로 설정되고 요청 간격은 5초이므로 웹사이트의 제한을 효과적으로 피할 수 있습니다. 물론 실제 사용 시에도 다양한 웹사이트에 따라 합리적인 액세스 간격을 설정해야 합니다.

(2) 분산 크롤링

분산 크롤링은 웹사이트의 제한을 효과적으로 피하고 크롤링 효율성을 향상시킬 수 있습니다. 기본 아이디어는 서로 다른 작업을 서로 다른 노드나 기계에 할당하고, 이를 독립적으로 처리하고, 결과를 함께 요약하는 것입니다. 분산 크롤링에는 상대적으로 복잡한 일정 관리, 통신 및 기타 기술이 필요합니다. 실제 크롤러에서는 타사 라이브러리나 클라우드 서비스를 사용하여 분산 크롤링을 구현할 수 있습니다.

결론

이 글에서는 기본 단계, 일반적으로 사용되는 라이브러리 및 핵심 기술을 포함하여 golang을 사용하여 크롤러를 작성하는 방법을 소개합니다. Golang은 크롤러의 요구 사항을 잘 충족할 수 있는 고성능의 간결하고 명확한 언어입니다. 그러나 크롤링 작업을 성공적으로 완료하려면 크롤링을 수행할 때 더 많은 기술을 이해하고 새로운 크롤링 방지 기술을 지속적으로 배워야 합니다.

위 내용은 golang에서 크롤러를 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.