Go+goquery로 GithubRanking으로 웹 스크래핑 시도
대상은 GithubRanking .
덧붙여서, 단지 랭킹 정보를 취득하고 싶은 경우는 GithubAPI 를 사용하면 됩니다.
목표
사용 라이브러리
goquery
jQuery 에 가까운 함수가 준비되어 있어 셀렉터도 사용할 수 있는 슈퍼 편리한 라이브러리
막상, 스크래핑!
goquery 추가
% go get github.com/PuerkitoBio/goquery
DOM 조사
% go get github.com/PuerkitoBio/goquery
$("a.list-group-item")
를 입력하여 검색 요소를 살펴보십시오.프로그램
package main
import (
"fmt"
"log"
"strings"
"time"
"github.com/PuerkitoBio/goquery"
)
const (
targetfqdn = "github-ranking.com"
)
func IsRelativePath(url string) bool {
if strings.Index(url, "//") == 0 {
return false
} else if strings.Index(url, "/") == 0 {
return true
} else {
return false
}
}
func GetAbsoluteURLFromRelativePath(scheme string, fqdn string, relativePath string) string {
return scheme + "://" + fqdn + relativePath
}
func hasNextPageURL(doc *goquery.Document) (string, bool) {
nexturl, exists := doc.Find("ul > li.next > a").First().Attr("href")
if exists == true && IsRelativePath(nexturl) {
return GetAbsoluteURLFromRelativePath("https", targetfqdn, nexturl), true
}
return nexturl, false
}
func outputRepoAndStar(groupItemSelection *goquery.Selection) {
groupItemSelection.Each(func(i int, s *goquery.Selection) {
repositorie := s.Find("span.name span.hidden-lg").Text()
stars := s.Find("span.stargazers_count").Text()
fmt.Printf("★ %s : %s\n", strings.TrimSpace(stars), strings.TrimSpace(repositorie))
})
}
func main() {
doc, err := goquery.NewDocument(GetAbsoluteURLFromRelativePath("https", targetfqdn, "/repositories"))
nexturl, hasNext := "", true
if err != nil {
log.Fatal(err)
}
for hasNext {
outputRepoAndStar(doc.Find("a.list-group-item"))
nexturl, hasNext = hasNextPageURL(doc)
doc, err = goquery.NewDocument(nexturl)
time.Sleep(3000)
}
}
포인트
func NewDocument
doc, err := goquery.NewDocument(GetAbsoluteURLFromRelativePath("https", targetfqdn, "/repositories"))
같이 사용 func (*Selection) Find
doc.Find("a.list-group-item")
와 같이 인수에 선택기를 지정 func (*Selection) First
nexturl, exists := doc.Find("ul > li.next > a").First()
와 같이 Find 함수로 지정된 셀렉터에 히트하는 요소 중에서 첫 번째 요소를 가져옵니다.func (*Selection) Attr
nexturl, exists := doc.Find("ul > li.next > a").First().Attr("href")
와 같이 대상 요소의 속성 값을 가져옵니다.실행
Command + 9
에서 Sublime 콘솔 열기run
결과
1000건 취득 완료
[ `run` | done: 1.188862586s ]
★ 77733 : bootstrap
★ 35984 : free-programming-books
★ 35311 : angular.js
★ 34715 : node
★ 34492 : d3
★ 33394 : jquery
★ 30484 : Font-Awesome
★ 28736 : html5-boilerplate
★ 25849 : awesome
★ 24954 : rails
★ 23174 : impress.js
★ 22520 : meteor
......省略......
★ 2763 : generator-angular-ful...
★ 2762 : JazzHands
★ 2762 : bottle
★ 2760 : serf
★ 2757 : nock
★ 2755 : scraperjs
★ 2755 : cool-retro-term
★ 2750 : passenger
★ 2748 : heatmap.js
★ 2747 : peerjs
참고
Reference
이 문제에 관하여(Go+goquery로 GithubRanking으로 웹 스크래핑 시도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/okatai/items/28893ff3129c980ff980
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Go+goquery로 GithubRanking으로 웹 스크래핑 시도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/okatai/items/28893ff3129c980ff980텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)