LoginSignup
1
1

[Go言語]goqueryを用いたWebスクレイピングメモ

Posted at

概要

  • ライブラリgoqueryを用いたWebスクレイピング方法についてメモする。

goquery 概要

  • Go言語で開発されたライブラリ。
  • 主にHTMLドキュメントの解析と操作を行うために使用される。
  • jQueryのようなシンタックスを模倣しており、HTMLドキュメントを簡単に選択、操作、抽出することができるように設計されている。

主な特徴

  1. jQuery風の操作: jQueryの選択子やメソッドを模倣しているため、WebページのDOM要素を簡単にトラバース(走査)や操作が可能。これにより、HTMLドキュメントからのデータ抽出が容易になる。
  2. HTMLドキュメントのパース: HTMLをパースしてドキュメントオブジェクトモデル(DOM)を作成し、その後、要素を簡単に検索して操作できる。これはWebスクレイピングやテストデータの生成など、さまざまな用途で利用できる。
  3. 軽量で高速: Go言語の軽量性と高速な実行速度を活かし、効率的なHTMLドキュメントの処理を実現する。

使用時の留意事項

  1. エラーハンドリング

    • パースやDOM操作で、さまざまな例外が発生する可能性がある。
      • URLフェッチエラー、HTMLパースエラー、セレクター検索エラー、テキスト抽出エラーなど
    • 適切なエラーハンドリングを行い、パース失敗時などのエラー処理を実装する必要がある。
  2. 並行処理

    • Goroutineを使ってマルチスレッドで処理を行うことができる。

    • 同時に同一のDOMツリーを操作すると競合が発生する可能性がある。適切な排他制御が必要となる。

      ⇒ 共有DOMツリーの排他制御、部分DOMツリーの排他制御、リードライタロックの利用、チャネルを使ったプロデューサ/コンシューマパターンなどの手法がある。

  3. セレクターの最適化

    • XPathやCSSセレクターを使ってDOMを検索できる。一方で複雑なセレクターは処理速度が遅くなる可能性がある。
    • 必要最小限のセレクターを使うような形で、パフォーマンスを意識して設計する必要がある。
  4. メモリ管理

    • HTMLドキュメントを完全にパースすると、大量のメモリを消費する可能性がある。
    • 必要最小限のデータのみ抽出するように実装し、メモリリークに留意する必要がある。
  5. ユーザーエージェント情報の設定

    • 一部のサイトではユーザーエージェントチェックを行っているため、適切なユーザーエージェント情報を設定する必要がある。
  6. 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

※タイトル要素の中身が表示される

参考情報

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1