Go 言語と Rod ライブラリを使ったウェブスクレイピング超かんたん入門
はじめに
Rod を使うと、動的サイトもかんたんにスクレイピングできます。
さっそく短いコードを書いてみましょう。
package main
import (
"fmt"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/launcher"
)
func main() {
// ヘッドレスブラウザを起動する
url := launcher.New().MustLaunch()
browser := rod.New().ControlURL(url).MustConnect()
// スクレイピング対象のページを指定する
page := browser.MustPage("https://zenn.dev/kenta_goto")
// ページが完全にロードされるのを待つ
page.MustWaitLoad()
// セレクターに一致する要素を取得する
elements := page.MustElements("h3.ArticleCard_title__UnBHE")
// 各要素のテキストを出力する
for _, element := range elements {
fmt.Println(element.MustText())
}
}
go mod init
して go mod tidy
しましょう。楽になりましたね、Go は。
さて、コード内のスクレイピング対象のページでは、Zenn の(誰も読まない自分の)Article 一覧を指定しました。
狙いは記事のタイトルテキストです。具体的なセレクタは 3.ArticleCard_title__UnBHE
になります。
コード内の一番のポイントは、page.MustWaitLoad()
です。これがないとうまく動作しません。ページのロードが終わるまで待つことで、狙いどおりのテキストを取ることができます。
実行してみましょう。
$ go run main.go
...
[launcher.Browser]2023/06/05 16:52:14 Progress: 44%
[launcher.Browser]2023/06/05 16:52:15 Progress: 44%
[launcher.Browser]2023/06/05 16:52:16 Progress: 45%
[launcher.Browser]2023/06/05 16:52:17 Progress: 45%
[launcher.Browser]2023/06/05 16:52:18 Progress: 45%
...
なにやらインストールが始まりました。これはローカル環境にヘッドレス Chromium がインストールされていない場合や、インストールされているバージョンが Rod と互換性のない場合に発生します。そのため、現在表示されている進捗表示は、Chromium のダウンロードとインストールの進捗を示しています。少し時間がかかるので気長に待ちましょう。
Windows の場合、最後に以下のようなエラーが出ました。
panic: fork/exec C:\Users\ppppe\AppData\Local\Temp\leakless-0c3354cd58f0813bb5b34ddf3a7c16ed\leakless.exe: Operation did not complete successfully because the file contains a virus or potentially unwanted software.
エラーメッセージによると、Windows のセキュリティ機能が leakless.exe というファイルをウィルスまたは望ましくないソフトウェアとして検出しているようです。このファイルは、Rod がブラウザを起動する際に使用する内部的なツールです。
この問題を解決するためには、Windows のセキュリティ設定でこのファイルを許可する必要があります。具体的な手順は次のとおりです。
[ウィルスと脅威の防止] > [保護の履歴] で leakless.exe に関する項目を [復元] します。
もう一度実行すると、意図したとおりのタイトルテキストが取れました。
Pythonを使用したCPUとメモリ使用率のリアルタイムグラフ表示
PowerShellでシンプルかつ実用的なプログレスバーを作成する方法
Go言語で学ぶ正規表現
PowerShell による Windows マシンリモート接続
PerlのREPL
バッチファイルで一括フォルダ作成
まとめ
お手軽スクレイピングに使用するライブラリとして Rod を紹介しましたが、Rod はヘッドレスブラウザを使用した高機能なライブラリです。アイデア次第で様々なことができると思います。
Discussion