collector := colly.NewCollector()
switcher, err := proxy.RoundRobinProxySwitcher(
    "http://proxy-a.example:8080",
    "http://proxy-b.example:8080",
)
if err != nil {
    return err
}
collector.SetProxyFunc(switcher)
err = collector.Visit("https://www.example.com/")

アプリケーションの関数で github.com/gocolly/colly/v2 とその proxy パッケージを使い、通常のエラー処理を保ちます。リクエストや非同期の訪問を開始する前にセレクターを設定します。HTTP プロキシ一覧は、スイッチャーの endpoint 入力に公開候補を提供します。

SetProxy は固定の endpoint を選びます。SetProxyFunc は HTTP transport にリクエストごとの選択を許します。これにより、各 OnRequest コールバック内で共有設定を置き換えることを避けられます。

この実装では、SetProxyFunc は DisableKeepAlives も true に設定します。既存の *http.Transport を更新しますが、異なる種類の transport は新しい HTTP transport に置き換えます。カスタムの RoundTripper の挙動が残ると決めつけず、意図的に保持してください。

Collector.Clone は HTTP backend を共有するため、クローンのプロキシを変更するとその共有 backend が変わる可能性があります。並行作業の前に所有権を確定してください。ラウンドロビン選択が切り替えるのは与えられた endpoint であり、検証済みの 公開出口 ID や独立に確認された可用性ではありません。

関連記事