CAPSOLVER
ブログ
geziyor を使ったウェブスクレイピングの方法

geziyor を使ったウェブスクレイピングの方法

Logo of CapSolver

Adélia Cruz

Neural Network Developer

27-Sep-2024

Geziyor: Go 用の強力な Web スクレイピングフレームワーク

Geziyor は、Go 用の最新の Web スクレイピングフレームワークであり、Web サイトをスクレイピングし、データを効率的に抽出するための強力なツールを提供するように設計されています。多くの従来のスクレイピングライブラリとは異なり、Geziyor は、高度にカスタマイズ可能なスクレイピングワークフローを提供しながら、使いやすさを重視しています。

主要な機能:

  • 並行処理サポート: 非同期操作をサポートしており、複数のページを同時にスクレイピングできるため、パフォーマンスが向上します。
  • リクエストのカスタマイズ: ヘッダー、Cookie、カスタムパラメータなど、HTTP リクエストを簡単に変更できます。
  • 自動スロットリング: サーバーへのリクエストをペース配分することにより、スクレイピング防止メカニズムのトリガーを防ぎます。
  • 組み込みのキャッシュと永続化: スクレイピングされたデータとレスポンスをキャッシュして、冗長なリクエストを回避できます。
  • 拡張性: リクエスト/レスポンスのインターセプト、カスタムミドルウェアなど、機能を拡張したり、イベントを処理したりするためのフックを提供します。
  • プロキシをサポート: 回転 IP や制限の回避のために、プロキシを簡単に統合できます。

前提条件

Geziyor を使用するには、以下を確保してください。

インストール

Geziyor をインストールするには、次を実行できます。

bash Copy
go get -u github.com/geziyor/geziyor

基本的な例:Geziyor での Web スクレイピング

以下は、Web サイトをスクレイピングして記事のタイトルを出力する簡単な例です。

go Copy
package main

import (
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
    "github.com/PuerkitoBio/goquery"
    "log"
)

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartURLs: []string{"https://news.ycombinator.com"},
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            r.HTMLDoc.Find(".storylink").Each(func(i int, s *goquery.Selection) {
                log.Println(s.Text())
            })
        },
    }).Start()
}

詳細な例:カスタムヘッダーと POST リクエストを使用したスクレイピング

場合によっては、ログインや動的な Web サイトとの対話など、サーバーとのより複雑な対話をシミュレートする必要がある場合があります。この例では、カスタムヘッダーと POST リクエストを送信する方法を示します。

go Copy
package main

import (
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
    "log"
)

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartRequestsFunc: func(g *geziyor.Geziyor) {
            g.Do(&client.Request{
                Method: "POST",
                URL:    "https://httpbin.org/post",
                Body:   []byte(`{"username": "test", "password": "123"}`),
                Headers: map[string]string{
                    "Content-Type": "application/json",
                },
            })
        },
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            log.Println(string(r.Body))
        },
    }).Start()
}

スクレイピング中に Cookie を管理したり、セッションを維持する必要がある場合があります。Geziyor は、各リクエストの Cookie を自動的に処理することで、Cookie の管理を簡素化します。必要に応じて、Cookie の処理プロセスをカスタマイズすることもできます。

go Copy
package main

import (
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
    "log"
)

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartRequestsFunc: func(g *geziyor.Geziyor) {
            g.Do(&client.Request{
                URL: "https://httpbin.org/cookies/set?name=value",
            })
        },
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            log.Println("Cookies:", r.Cookies())
        },
    }).Start()
}

Geziyor でのプロキシの使用

IP 制限やブロックを回避しながら Web サイトをスクレイピングするには、リクエストをプロキシを経由してルーティングできます。以下は、Geziyor でプロキシサポートを構成する方法です。

go Copy
package main

import (
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
    "log"
)

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartRequestsFunc: func(g *geziyor.Geziyor) {
            g.Do(&client.Request{
                URL:    "https://httpbin.org/ip",
                Proxy:  "http://username:password@proxyserver:8080",
            })
        },
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            log.Println(string(r.Body))
        },
    }).Start()
}

Geziyor での CAPTCHA の処理

Geziyor は CAPTCHA をネイティブに解決しませんが、CapSolver などの CAPTCHA 解決サービスと統合できます。以下は、CapSolver を使用して Geziyor と連携して CAPTCHA を解決する方法です。

例:Geziyor と CapSolver を使用した ReCaptcha V2 の解決

まず、CapSolver を統合し、CAPTCHA チャレンジのリクエストを処理する必要があります。

go Copy
package main

import (
    "encoding/json"
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
    "log"
    "time"
)

const CAPSOLVER_KEY = "YourKey"

func createTask(url, key string) (string, error) {
    payload := map[string]interface{}{
        "clientKey": CAPSOLVER_KEY,
        "task": map[string]interface{}{
            "type":        "ReCaptchaV2TaskProxyLess",
            "websiteURL":  url,
            "websiteKey":  key,
        },
    }

    response, err := client.NewRequest().
        Method("POST").
        URL("https://api.capsolver.com/createTask").
        JSON(payload).
        Do()

    if err != nil {
        return "", err
    }

    var result map[string]interface{}
    json.Unmarshal(response.Body, &result)
    return result["taskId"].(string), nil
}

func getTaskResult(taskId string) (string, error) {
    payload := map[string]interface{}{
        "clientKey": CAPSOLVER_KEY,
        "taskId":    taskId,
    }

    for {
        response, err := client.NewRequest().
            Method("POST").
            URL("https://api.capsolver.com/getTaskResult").
            JSON(payload).
            Do()

        if err != nil {
            return "", err
        }

        var result map[string]interface{}
        json.Unmarshal(response.Body, &result)

        if result["status"] == "ready" {
            return result["solution"].(string), nil
        }

        time.Sleep(5 * time.Second)
    }
}

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartRequestsFunc: func(g *geziyor.Geziyor) {
            taskId, _ := createTask("https://example.com", "6LcR_okUAAAAAPYrPe-HK_0RULO1aZM15ENyM-Mf")
            solution, _ := getTaskResult(taskId)

            g.Do(&client.Request{
                Method: "POST",
                URL:    "https://example.com/submit",
                Body:   []byte(`g-recaptcha-response=` + solution),
            })
        },
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            log.Println("Captcha Solved:", string(r.Body))
        },
    }).Start()
}

Geziyor でのパフォーマンスの最適化

Geziyor は、大量のスクレイピングタスクの処理に優れていますが、特定のオプションを調整することでパフォーマンスをさらに最適化できます。

  • 並行処理: ConcurrentRequests を増やすことで、複数のリクエストを同時に実行できます。
  • リクエストの遅延: 検出を回避するために、リクエスト間に遅延を設けます。

並行処理と遅延を適用した例:

go Copy
package main

import (
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
)

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartURLs:          []string{"https://example.com"},
        ParseFunc:          func(g *geziyor.Geziyor, r *client.Response) {},
        ConcurrentRequests: 10,
        RequestDelay:       2,
    }).Start()
}

ボーナスコード

CapSolver: scrape にて、最高の CAPTCHA ソリューションのためのボーナスコード を請求してください。コードを適用すると、チャージごとに追加で 5% のボーナスが付与され、何度でも使用できます。

まとめ

Geziyor は、Go 用の強力で高速かつ柔軟な Web スクレイピングフレームワークであり、スケーラブルなスクレイピングシステムを構築したい開発者にとって最適な選択肢です。並行処理、カスタマイズ可能なリクエスト、CapSolver などの外部サービスとの統合が組み込まれているため、シンプルで高度なスクレイピングタスクの両方に適したツールとなっています。

ブログ、e コマースサイトからデータを収集する場合でも、カスタムスクレイピングパイプラインを構築する場合でも、Geziyor は迅速かつ効率的に作業を開始するために必要な機能を提供します。

コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。CapSolverは、すべての適用される法律および規制の遵守に努めています。CapSolverネットワークの不法、詐欺、または悪用の目的での使用は厳格に禁止され、調査されます。私たちのキャプチャ解決ソリューションは、公共データのクローリング中にキャプチャの問題を解決する際に100%のコンプライアンスを確保しながら、ユーザーエクスペリエンスを向上させます。私たちは、サービスの責任ある使用を奨励します。詳細については、サービス利用規約およびプライバシーポリシーをご覧ください。

もっと見る