Golang と Colly で効率的なスクレイピングを実装する方法

目次

Golang と Colly を活用する

Golang は高速な処理が求められるシステム開発に適した言語であり、並行処理や高いパフォーマンスを活かしてスクレイピングを行うのにも適している。その中でも、Colly はシンプルな API で直感的にデータを収集できる便利なライブラリだ。本記事では、Golang と Colly を活用して効率的なスクレイピングを行う方法を解説する。

あわせて読みたい
The Go Programming Language Go is an open source programming language that makes it simple to build secure, scalable systems.

Colly の特徴

Colly は Golang のスクレイピングライブラリの中でも特に人気があり、次のような特徴を持つ。

GitHub
GitHub - gocolly/colly: Elegant Scraper and Crawler Framework for Golang Elegant Scraper and Crawler Framework for Golang. Contribute to gocolly/colly development by creating an account on GitHub.

シンプルな 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 を使うことで、高速で柔軟なスクレイピングを実装できる。基本的な実装に加え、フィルタリングやページネーションの処理を組み合わせることで、より実用的なデータ収集が可能になる。スクレイピングを行う際は、サイトのルールを守りながら適切に活用しよう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次