golangのgoqueryでスクレイピング(データ収集)する方法

2022年1月3日

参照 : 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

2022年1月3日2022/01,江端さんの技術メモ

Posted by ebata