Go 및 Colly를 사용한 웹 스크레이퍼 구성 방법

최초 출시: divrhino.com
어떤 것들은 API가 없는 것이다.이런 상황에서, 당신은 항상 필요한 데이터를 얻을 수 있도록 작은 네트워크 스크레이퍼를 쓸 수 있다.이 강좌에서 우리는 웹 스크레이퍼를 어떻게 구축하는지 배울 것이다.또한 긁은 데이터를 JSON 파일에 저장하는 방법도 학습합니다.Go 및 Colly 패키지와 협력합니다.Colly 패키지는 DOM을 기어다니고 긁고 옮겨다닐 수 있도록 해 줍니다.

선결 조건


계속하려면 Go를 설치해야 합니다.

항목 디렉토리 설정


자, 시작합시다.우선 저장 항목의 디렉터리로 전환합니다.내 경우, 이것은 '사이트' 폴더가 될 것입니다. 이것은 당신과 다를 수 있습니다.이 곳에서 rhino-scraper이라는 프로젝트 폴더를 만들 것입니다
cd Sites
mkdir rhino-scraper
cd rhino-scraper
rhino-scraper 프로젝트 폴더에 main.go 파일을 만듭니다.이것은 우리 응용 프로그램의 입구점이 될 것이다.
touch main.go

초기화 고 모듈


프로젝트의 의존항을 처리하기 위해 go modules을 사용할 것입니다.
다음 명령을 실행하면 go.mod 파일이 생성됩니다.
go mod init example.com/rhino-scraper
colly 패키지를 사용하여 웹 스크립트를 구축할 것입니다. 다음 프로그램을 실행해서 설치합니다.
go get github.com/gocolly/colly
위 명령을 실행하면 go.sum 파일이 생성됩니다.이 파일에는 직접 의존항과 간접 의존항의 검사와 버전 목록이 포함되어 있습니다.이것은 모든 의존 항목의 검사와 검사가 수정되지 않았는지 확인하는 데 사용됩니다.
이전에 작성한 main.go 파일에는 기본 package mainfunc main()을 설정합니다.
package main

func main() {}

분석 대상 페이지 구조


본 강좌에서 우리는 FactRetriever.com에서 코뿔소의 사실을 추출할 것이다.
다음은 목표 페이지에서 캡처한 것이다.우리는 모든 사실이 id와 묘사로 구성된 간단한 구조를 가지고 있음을 알 수 있다.

사실 구조 작성

main.go 파일에서 우리는 rhino 사실의 구조를 나타내는 사실 구조 유형을 작성할 수 있다.이러한 사실은 다음과 같습니다.
  • 유형 int
  • ID
  • 유형은 string의 설명이다.
  • Fact struct type, ID, Description 필드는 모두 대문자로 되어 있습니다. package main 이외에 사용할 수 있기를 바랍니다.
    package main
    
    type Fact struct {
        ID          int    `json:"id"`
        Description string `json:"description"`
    }
    
    func main() {}
    
    func main에서, 우리는 사실을 저장하기 위해 빈 세션을 만들 것입니다.우리는 길이 0으로 그것을 초기화하고 실행할 때 그것을 추가할 것이다.이 절편은 사실만 보존할 수 있다.
    package main
    
    type Fact struct {
        ID          int    `json:"id"`
        Description string `json:"description"`
    }
    
    func main() {
        allFacts := make([]Fact, 0)
    }
    

    Colly 패키지 사용


    웹 스크립트를 구축하는 데 필요한 방법과 기능을 제공하는 colly라는 패키지를 가져옵니다.
    package main
    
    import "github.com/gocolly/colly"
    
    type Fact struct {
        ID          int    `json:"id"`
        Description string `json:"description"`
    }
    
    func main() {
        allFacts := make([]Fact, 0)
    }
    
    colly 패키지를 사용하면 새 수집기를 만들고factretriever로 설정합니다.일반 도메인 이름 형식
    package main
    
    import "github.com/gocolly/colly"
    
    type Fact struct {
        ID          int    `json:"id"`
        Description string `json:"description"`
    }
    
    func main() {
        allFacts := make([]Fact, 0)
    
        collector := colly.NewCollector(
            colly.AllowedDomains("factretriever.com", "www.factretriever.com"),
        )
    }
    

    사실 목록의 HTML 구조


    만약 우리가 HTML 구조를 검사한다면, 우리는 사실이 무질서한 목록의 목록 항목이고, 이 목록의 종류는 factsList이다.모든 사실 목록 항목에 id이 분배되었다.잠시 후 이 id을 사용하겠습니다.

    이제 우리는 HTML 구조가 어떤 것인지 알게 되었다. 우리는 DOM을 옮겨다니는 코드를 작성할 수 있다.colly 패키지는 goQuery라는 라이브러리를 사용하여 DOM과 상호작용을 합니다.예를 들어 꼬꼬랑은 꼬꼬랑이다.
    다음은 지금까지의 코드입니다.우리는 한 걸음 한 걸음 새 대사를 복습할 것이다
    package main
    
    import (
        "fmt"
        "log"
        "strconv"
    
        "github.com/gocolly/colly"
    )
    
    type Fact struct {
        ID          int    `json:"id"`
        Description string `json:"description"`
    }
    
    func main() {
        allFacts := make([]Fact, 0)
    
        collector := colly.NewCollector(
            colly.AllowedDomains("factretriever.com", "www.factretriever.com"),
        )
    
        collector.OnHTML(".factsList li", func(element *colly.HTMLElement) {
            factId, err := strconv.Atoi(element.Attr("id"))
            if err != nil {
                log.Println("Could not get id")
            }
    
            factDesc := element.Text
    
            fact := Fact{
                ID:          factId,
                Description: factDesc,
            }
    
            allFacts = append(allFacts, fact)
        })
    }
    
    다음은 발생한 일이다.
  • fmt, logstrconv 포장
  • 우리가 사용하는 방법은 OnHTML 방법입니다.이것은 두 가지 논점이 필요하다.첫 번째 파라미터는 목표 선택기이고 두 번째 파라미터는 리셋 함수로 목표 선택기
  • 을 만날 때마다 이 함수를 호출합니다
  • OnHTML의 주체에서
  • 에 교체된 모든 요소의 ID를 저장하는 변수를 만들었다
  • 이 ID는 현재 string 유형이므로 strconv.Atoi을 사용하여 int 유형으로 변환
  • strconv.Atoi 방법은 오류를 두 번째 반환값으로 되돌려주기 때문에 기본적인 오류 처리
  • 우리는 모든 사실의 factDesc 텍스트를 저장하기 위해 description이라는 변수를 만들었다.우리가 이전에 세운 사실 구조 유형을 바탕으로 우리는 사실 묘사의 유형이 string이 되기를 희망한다.
  • 여기서
  • 의 모든 목록 항목을 교체하기 위해 새로운 사실 구조를 만듭니다
  • 그리고 사실구조를 allFacts 슬라이스
  • 에 부착

    기어오르고 닦기 시작하다


    우리는 우리의 스크레이퍼가 실제로 이 페이지를 방문한다는 것을 알 수 있도록 시각적 피드백을 원한다.우리 지금부터 시작합시다.
    package main
    
    import (
        "fmt"
        "log"
        "strconv"
    
        "github.com/gocolly/colly"
    )
    
    type Fact struct {
        ID          int    `json:"id"`
        Description string `json:"description"`
    }
    
    func main() {
        allFacts := make([]Fact, 0)
    
        collector := colly.NewCollector(
            colly.AllowedDomains("factretriever.com", "www.factretriever.com"),
        )
    
        collector.OnHTML(".factsList li", func(element *colly.HTMLElement) {
            factId, err := strconv.Atoi(element.Attr("id"))
            if err != nil {
                log.Println("Could not get id")
            }
    
            factDesc := element.Text
    
            fact := Fact{
                ID:          factId,
                Description: factDesc,
            }
    
            allFacts = append(allFacts, fact)
        })
    
        collector.OnRequest(func(request *colly.Request) {
            fmt.Println("Visiting", request.URL.String())
        })
    
        collector.Visit("https://www.factretriever.com/rhino-facts")
    }
    
    다음은 지금 벌어지고 있는 일입니다.
  • URL
  • 을 요청할 때마다 fmt.Println을 사용하여 Visting 메시지를 출력합니다.
  • Dell은 Visit() 방법을 사용하여 프로그램의 시작점
  • 만약 우리가 지금 터미널에서 프로그램을 실행하고 있다면
    go run main.go
    
    수집가들이 사실 검색기의 rhino facts 페이지를 방문했다는 것을 알려 줍니다.일반 도메인 이름 형식

    JSON에 데이터 저장


    우리는 우리가 수집한 데이터를 다른 곳에서 사용하고 싶어 할지도 모른다.JSON 파일에 저장합니다.
    package main
    
    import (
        "fmt"
        "io/ioutil"
        "log"
        "os"
        "strconv"
    
        "github.com/gocolly/colly"
    )
    
    type Fact struct {
        ID          int    `json:"id"`
        Description string `json:"description"`
    }
    
    func main() {
        allFacts := make([]Fact, 0)
    
        collector := colly.NewCollector(
            colly.AllowedDomains("factretriever.com", "www.factretriever.com"),
        )
    
        collector.OnHTML(".factsList li", func(element *colly.HTMLElement) {
            factId, err := strconv.Atoi(element.Attr("id"))
            if err != nil {
                log.Println("Could not get id")
            }
            factDesc := element.Text
    
            fact := Fact{
                ID:          factId,
                Description: factDesc,
            }
    
            allFacts = append(allFacts, fact)
        })
    
        collector.OnRequest(func(request *colly.Request) {
            fmt.Println("Visiting", request.URL.String())
        })
    
        collector.Visit("https://www.factretriever.com/rhino-facts")
    
        writeJSON(allFacts)
    }
    
    func writeJSON(data []Fact) {
        file, err := json.MarshalIndent(data, "", " ")
        if err != nil {
            log.Println("Unable to create json file")
            return
        }
    
        _ = ioutil.WriteFile("rhinofacts.json", file, 0644)
    }
    
    다음은 위 코드에서 발생한 상황입니다.
  • ioutil 패키지를 가져오면
  • 파일을 쓸 수 있습니다.
  • 수입 os 포장
  • OS 패키지는 OS 기능의 인터페이스를 제공합니다.
  • 은 사실
  • 형식의 슬라이드를 받아들이는 함수를 만듭니다
  • 함수체 내부에서 MarshalIndent을 사용하여
  • 에 전달된 데이터를 봉송합니다
  • 메서드는 데이터의 JSON 인코딩을 반환하고 오류
  • 을 반환합니다.
  • 오류 처리만약 우리가 여기서 오류를 얻게 된다면, 우리는 단지 로그 메시지를 출력해서, JSON 파일
  • 을 만들 수 없다고 말할 뿐이다
  • 그리고 저희가 제공한 MarshalIndent 방법으로 JSON 인코딩된 데이터를 WriteFile이라는 파일에 쓸 수 있습니다.
  • 이 파일은 아직 존재하지 않기 때문에 "rhinofacts.json" 방법은 permissions code of 0644으로 만들 것입니다.
  • 우리의 WriteJSON 함수는 이미 사용할 수 있습니다.우리는 그것에게 전화를 걸어 WriteFile을 전달할 수 있다.
    현재 터미널로 돌아가서 명령 allFacts을 실행하면, 모든 rhino 사실은 go run main.go이라는 JSON 파일에 저장됩니다.

    결론


    이 강좌에서 Go와 Colly 패키지를 사용하여 웹 스크레이퍼를 구축하는 방법을 배웠습니다.만약 당신이 이 글을 좋아하고 더 많은 것을 원한다면 다음과 같은 내용을 고려할 수 있다.
    축하해, 잘했어.계속 공부해, 계속 코딩해!

    디프리노 / 코뿔소 스크레이퍼


    Go and colly를 사용하여 웹 스크레이퍼를 구축하는 방법에 대해 알아보십시오.튜토리얼은 유튜브 리니노 채널에서 볼 수 있다.


    코뿔소 스크레이퍼

  • 텍스트 자습서: https://divrhino.com/articles/build-webscraper-with-go-and-colly/
  • 비디오 자습서:
  • View on GitHub

    좋은 웹페이지 즐겨찾기