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

目次

Golang と Colly を活用する

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

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

Colly の特徴

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

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 のインストール

まずは CollyGolang プロジェクトに導入する。

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 つに制限する。

まとめ

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

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