概要
- ライブラリ
goquery
を用いたWebスクレイピング方法についてメモする。
goquery 概要
- Go言語で開発されたライブラリ。
- 主にHTMLドキュメントの解析と操作を行うために使用される。
- jQueryのようなシンタックスを模倣しており、HTMLドキュメントを簡単に選択、操作、抽出することができるように設計されている。
主な特徴
- jQuery風の操作: jQueryの選択子やメソッドを模倣しているため、WebページのDOM要素を簡単にトラバース(走査)や操作が可能。これにより、HTMLドキュメントからのデータ抽出が容易になる。
- HTMLドキュメントのパース: HTMLをパースしてドキュメントオブジェクトモデル(DOM)を作成し、その後、要素を簡単に検索して操作できる。これはWebスクレイピングやテストデータの生成など、さまざまな用途で利用できる。
- 軽量で高速: Go言語の軽量性と高速な実行速度を活かし、効率的なHTMLドキュメントの処理を実現する。
使用時の留意事項
-
エラーハンドリング
- パースやDOM操作で、さまざまな例外が発生する可能性がある。
- URLフェッチエラー、HTMLパースエラー、セレクター検索エラー、テキスト抽出エラーなど
- 適切なエラーハンドリングを行い、パース失敗時などのエラー処理を実装する必要がある。
- パースやDOM操作で、さまざまな例外が発生する可能性がある。
-
並行処理
-
Goroutineを使ってマルチスレッドで処理を行うことができる。
-
同時に同一のDOMツリーを操作すると競合が発生する可能性がある。適切な排他制御が必要となる。
⇒ 共有DOMツリーの排他制御、部分DOMツリーの排他制御、リードライタロックの利用、チャネルを使ったプロデューサ/コンシューマパターンなどの手法がある。
-
-
セレクターの最適化
- XPathやCSSセレクターを使ってDOMを検索できる。一方で複雑なセレクターは処理速度が遅くなる可能性がある。
- 必要最小限のセレクターを使うような形で、パフォーマンスを意識して設計する必要がある。
-
メモリ管理
- HTMLドキュメントを完全にパースすると、大量のメモリを消費する可能性がある。
- 必要最小限のデータのみ抽出するように実装し、メモリリークに留意する必要がある。
-
ユーザーエージェント情報の設定
- 一部のサイトではユーザーエージェントチェックを行っているため、適切なユーザーエージェント情報を設定する必要がある。
-
Encoding情報の取得
- HTMLドキュメントのエンコーディング情報を取得し、適切にデコードする必要がある。
事前準備
スクレイピング用ライブラリgoquery
インストール
go get github.com/PuerkitoBio/goquery
サンプルコード
次のような処理を行うgoqueryを用いたサンプルコードを作成する。
処理の流れ
コード
main.go
package main
import (
"fmt"
"log"
"net/http"
"github.com/PuerkitoBio/goquery"
)
func main() {
// ターゲット URL
url := "http://example.com"
// ターゲットURLへGETリクエスト
res, err := http.Get(url)
if err != nil {
log.Fatal("Error fetching URL: ", err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
log.Fatalf("Status code error: %d %s", res.StatusCode, res.Status)
}
// goqueryでdocumentをパースする
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
log.Fatal("Error loading HTTP response body: ", err)
}
// "title"要素を取得する
title := doc.Find("title").Text()
fmt.Println("Page Title:", title)
}
動作確認
- 下記コマンドを実行する。
go run main.go
- 実行結果
Page Title: Example Domain
※タイトル要素の中身が表示される