Golang と Colly を活用する
Golang は高速な処理が求められるシステム開発に適した言語であり、並行処理や高いパフォーマンスを活かしてスクレイピングを行うのにも適している。その中でも、Colly はシンプルな API で直感的にデータを収集できる便利なライブラリだ。本記事では、Golang と Colly を活用して効率的なスクレイピングを行う方法を解説する。
Colly の特徴
Colly は Golang のスクレイピングライブラリの中でも特に人気があり、次のような特徴を持つ。
シンプルな API
直感的に書けるコードでデータ収集が可能
並行処理対応
複数のページを同時に取得できる
robots.txt に準拠
スクレイピングのルールを尊重しながら実行可能
リクエスト制限の設定
サーバーに負担をかけずにデータを取得
Colly のインストール
まずは Colly を Golang プロジェクトに導入する。
go get -u github.com/gocolly/colly/v2
これで Colly を利用する準備が整う。
基本的なスクレイピングの実装
次に、ニュースサイトのタイトルを取得するシンプルなスクレイピングのコードを紹介する。
package main
import (
"fmt"
"github.com/gocolly/colly/v2"
)
func main() {
c := colly.NewCollector()
c.OnHTML("h2 a", func(e *colly.HTMLElement) {
fmt.Println("タイトル:", e.Text)
})
c.Visit("https://example.com/news")
}
このコードでは、h2 タグ内の a 要素のテキストを取得し、コンソールに出力している。
特定のキーワードを含む記事のリンクを取得
例えば、ニュースサイトの中から Golang に関する記事だけを取得したい場合、次のようにフィルタリングできる。
c.OnHTML("article h2 a", func(e *colly.HTMLElement) {
title := e.Text
link := e.Attr("href")
if strings.Contains(title, "Golang") {
fmt.Printf("Golang 記事: %s\nリンク: %s\n", title, link)
}
})
strings.Contains(title, "Golang") で、記事タイトルに Golang という単語が含まれているかをチェックし、一致するものだけを表示する。
ページネーションの対応
多くのサイトでは複数ページにまたがる記事が掲載されている。そのため、次のページを自動で取得する機能を追加すると便利だ。
c.OnHTML("a.next", func(e *colly.HTMLElement) {
nextPage := e.Attr("href")
if nextPage != "" {
c.Visit(e.Request.AbsoluteURL(nextPage))
}
})
e.Request.AbsoluteURL(nextPage) を使うことで、相対 URL でも正しくアクセスできるようになる。
スクレイピングの注意点
Colly を活用する際には、以下の点に注意しよう。
robots.txt を確認する
サイトによってはスクレイピングが禁止されていることがある
リクエスト間隔を考慮する
サーバーに負荷をかけないよう、適切な間隔を設定する
利用規約を確認する
データの取得や再利用に制限がある場合がある
例えば、リクエスト間隔を調整するには次のように設定する。
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Delay: 2 * time.Second,
Parallelism: 1,
})
この設定により、リクエスト間隔を 2 秒ごとにし、並列リクエストを 1 つに制限する。
まとめ
Golang と Colly を使うことで、高速で柔軟なスクレイピングを実装できる。基本的な実装に加え、フィルタリングやページネーションの処理を組み合わせることで、より実用的なデータ収集が可能になる。スクレイピングを行う際は、サイトのルールを守りながら適切に活用しよう。
