Colly は Go言語向けのスクレイピング・クローリングフレームワークです。Collectorオブジェクトにコールバックを登録するだけで、HTTPリクエスト送信からHTML・XML解析、リンク追跡までを一貫して扱えます。単体プロセスでも並列・非同期・キュー方式でも動かせる設計になっています。
中核は colly.go の Collector構造体です。NewCollectorでインスタンスを作り、AllowedDomains・CacheDir などのオプション関数で挙動を設定します。Visit(url)を呼ぶと http_backend.go 経由でnet/httpによるリクエストが送られ、response.goでレスポンスを受け取ります。HTMLはgoquery(PuerkitoBio/goquery)でhtmlelement.goがラップし、XMLはantchfx/xmlqueryをxmlelement.goが扱います。OnRequest・OnResponse・OnHTML・OnXML・OnError・OnScrapedという順にコールバックが発火し、e.Request.Visit(link)で新しいリンクをキューに追加していきます。queue/queue.goはワーカー数を指定した並列処理を、storage/storage.goはCookieやキャッシュの永続化を担当します。robots.txtはtemoto/robotstxtで解釈され、AllowedDomainsと合わせてクロール範囲を制御します。extensions/以下ではUser-Agentのランダム化やReferer付与などの補助機能が用意されています。
- STEP 01
go get github.com/gocolly/colly/v2 でモジュールを取得し、_examples/basic/basic.go相当のコードを go run で実行します。
- STEP 02
実行すると Visiting https:... というログが標準出力に流れ、AllowedDomainsで指定したドメイン内のリンクだけが順に辿られるのを確認できます。
- STEP 03
_examples/cryptocoinmarketcap のように OnHTML内でCSVライターへ書き込む例を動かすと、実行後にcryptocoinmarketcap.csvが生成され中身に価格データが入っています。
- STEP 04
_examples/coursera_courses を試すと CacheDir指定によりcoursera_cacheフォルダが作られ、再実行時はキャッシュから読み込まれて通信が減るのが体感できます。
- STEP 05
cmd/colly の colly new コマンドを使うと、--callbacks=html,response,errorのようなオプション付きで雛形のGoファイルが自動生成されます。
- STEP 06
実サイトを対象にすると robots.txt やレート制限に引っかかり、OnErrorコールバックでステータスコード付きのエラーが記録される場面に出会います。
手元では、指定URLから始まりリンクを辿りながら抽出したデータがCSVやJSONファイル、または標準出力のログとして得られます。cmd/colly new を使えばボイラープレートのGoファイルがすぐ手に入ります。キャッシュを使えば再実行時の通信量を抑えられ、queueパッケージを使えば並列数を制御したクロール結果が得られます。
_examples内の対象サイト(coursera.org、coinmarketcap.comなど)はHTML構造が変わりやすく、そのままではセレクタが古くなって動かない可能性があります。
robots.txtやAllowedDomainsの設定を誤ると、意図しない範囲まで無制限にクロールしてしまう恐れがあります。
go.modはgo1.24.0とtoolchain go1.24.9を要求しており、古いGo環境では素直にビルドできない場合があります。
並列・非同期設定(Async、queueのワーカー数)を高くしすぎると対象サイトからレート制限やアクセス拒否を受けるリスクがあります。
Go言語でクローラーやスクレイパーを自作したい開発者、特にコールバックベースの明快なAPIとキャッシュ・並列処理・robots.txt対応を標準機能として求める人に向いています。README・go.mod・cmd/colly・_examples群のソースコードが一致して同じ設計思想(Collector中心のコールバック駆動)を示しているため、実際に動かさなくても挙動の骨格は十分に信頼して判断できます。ただし対象サイトのHTML変化やレート制限への対応は利用者側の運用次第です。