Go 및 Colly를 사용한 웹 스크레이퍼 구성 방법
24065 단어 tutorialwebscrapergocolly
어떤 것들은 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 main
과 func main()
을 설정합니다.package main
func main() {}
분석 대상 페이지 구조
본 강좌에서 우리는 FactRetriever.com에서 코뿔소의 사실을 추출할 것이다.
다음은 목표 페이지에서 캡처한 것이다.우리는 모든 사실이 id와 묘사로 구성된 간단한 구조를 가지고 있음을 알 수 있다.
사실 구조 작성
main.go
파일에서 우리는 rhino 사실의 구조를 나타내는 사실 구조 유형을 작성할 수 있다.이러한 사실은 다음과 같습니다.int
및 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
, log
및 strconv
포장 OnHTML
방법입니다.이것은 두 가지 논점이 필요하다.첫 번째 파라미터는 목표 선택기이고 두 번째 파라미터는 리셋 함수로 목표 선택기 OnHTML
의 주체에서 string
유형이므로 strconv.Atoi
을 사용하여 int
유형으로 변환strconv.Atoi
방법은 오류를 두 번째 반환값으로 되돌려주기 때문에 기본적인 오류 처리 factDesc
텍스트를 저장하기 위해 description
이라는 변수를 만들었다.우리가 이전에 세운 사실 구조 유형을 바탕으로 우리는 사실 묘사의 유형이 string
이 되기를 희망한다.기어오르고 닦기 시작하다
우리는 우리의 스크레이퍼가 실제로 이 페이지를 방문한다는 것을 알 수 있도록 시각적 피드백을 원한다.우리 지금부터 시작합시다.
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")
}
다음은 지금 벌어지고 있는 일입니다.fmt.Println
을 사용하여 Visting
메시지를 출력합니다.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
포장 MarshalIndent
을 사용하여 MarshalIndent
방법으로 JSON 인코딩된 데이터를 WriteFile
이라는 파일에 쓸 수 있습니다."rhinofacts.json"
방법은 permissions code of 0644으로 만들 것입니다.WriteFile
을 전달할 수 있다.현재 터미널로 돌아가서 명령
allFacts
을 실행하면, 모든 rhino 사실은 go run main.go
이라는 JSON 파일에 저장됩니다.결론
이 강좌에서 Go와 Colly 패키지를 사용하여 웹 스크레이퍼를 구축하는 방법을 배웠습니다.만약 당신이 이 글을 좋아하고 더 많은 것을 원한다면 다음과 같은 내용을 고려할 수 있다.
축하해, 잘했어.계속 공부해, 계속 코딩해!
디프리노 / 코뿔소 스크레이퍼
Go and colly를 사용하여 웹 스크레이퍼를 구축하는 방법에 대해 알아보십시오.튜토리얼은 유튜브 리니노 채널에서 볼 수 있다.
코뿔소 스크레이퍼
Reference
이 문제에 관하여(Go 및 Colly를 사용한 웹 스크레이퍼 구성 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/divrhino/how-to-build-a-web-scraper-with-go-and-colly-47el텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)