Go+goquery로 GithubRanking으로 웹 스크래핑 시도

11868 단어 5goqueryscrapingGitHub
Go의 스크래핑 시스템 라이브러리 요약 안에서 goquery를 픽업하여 시도했습니다.
대상은 GithubRanking .
덧붙여서, 단지 랭킹 정보를 취득하고 싶은 경우는 GithubAPI 를 사용하면 됩니다.

목표


  • Github Repositories Ranking
  • 페이징을 따라 가면서 상위 1000 개의 리포지토리 이름과 star 수를 얻습니다



  • 사용 라이브러리



  • goquery

  • jQuery 에 가까운 함수가 준비되어 있어 셀렉터도 사용할 수 있는 슈퍼 편리한 라이브러리


  • 막상, 스크래핑!



    goquery 추가


    % go get github.com/PuerkitoBio/goquery
    

    DOM 조사


  • 브라우저의 개발자 콘솔이나 Firebug를 사용하여 DOM을 조사합니다.
  • goquery는 jQuery의 셀렉터를 거의 사용할 수 있으므로 콘솔에서 셀렉터에 맞추어 js 작성하여 취득 요소를 확인하는 것이 효율이 좋다.
  • 예) 콘솔에 $("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")) 같이 사용
  • 인수의 URL에 요구 송부해 응답 취득&DOM의 로드&해석까지 해 준다

  • 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")와 같이 대상 요소의 속성 값을 가져옵니다.

    실행


  • GoSublime을 사용하고 있으므로 Command + 9 에서 Sublime 콘솔 열기
  • GoSublime을 넣는 방법은 10분 만에 끝나는 Go 언어 개발 환경 구축을 참조하십시오

  • 콘솔에서 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
    

    참고

    좋은 웹페이지 즐겨찾기