golangのgoqueryでスクレイピング(データ収集)する方法
参照 : https://github.com/PuerkitoBio/goquery
goqueryは、jQueryに似た構文と機能群をGo言語に提供するものです。
$ go get github.com/PuerkitoBio/goquery
で使うことができるようになります。
サンプルプログラムで、この内容の解説を試みます。
package main
import (
"fmt"
"log"
"net/http"
"github.com/PuerkitoBio/goquery"
)
func ExampleScrape() {
// Request the HTML page.
res, err := http.Get("http://kobore.net")
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
}
// Load the HTML document
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
log.Fatal(err)
}
doc.Find("input").Each(func(i int, s *goquery.Selection) {
// For each item found, get the title
title, _ := s.Attr("type")
fmt.Printf("Review %d: %s\n", i, title)
})
/*
上記によって以下の4行がピックアップされる。
<input type="hidden" name="cx" value="010448971387544815344:gehqdwxqnlo" />
<input type="hidden" name="ie" value="Shift_JIS" />
<input type="text" name="q" size="10" />
<input type="submit" name="sa" value="Search" />
*/
}
func main() {
ExampleScrape()
}
対象となる、Webのhtmlは以下の通り
(前略)
<TITLE>kobore.net</TITLE>
</head>
<TD ALIGN="right">
<A HREF="./index-en.shtml">English</A> /
Japanese
</TD>
<div align="RIGHT">
<img src="https://www.kobore.net/KOBORE-small.jpg">
<form id="cse-search-box" action="https://google.com/cse" target="_blank">
<input type="hidden" name="cx" value="010448971387544815344:gehqdwxqnlo" />
<input type="hidden" name="ie" value="Shift_JIS" />
<input type="text" name="q" size="10" />
<input type="submit" name="sa" value="Search" />
</form>
</div>
<body BGCOLOR="#F0FFA0">
<H1 ALIGN="center">こぼれネット</H1>
<H2 ALIGN="center">
www.kobore.net
</H2>
(後略)
出力結果は、以下の通り。
C:\Users\ebata\kese\gonet-html>go run main.go
Review 0: hidden
Review 1: hidden
Review 2: text
Review 3: submit