[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-ja-colly-purokushi-roteshon-gaido":3},{"success":4,"payload":5,"related":59,"errors":123},true,{"id":6,"slug":7,"title":8,"excerpt":9,"body_html":10,"meta_title":11,"meta_description":12,"canonical_url":13,"canonical_override":14,"og_title":11,"og_description":12,"og_image_url":15,"faq_json":16,"key_takeaways":14,"allow_index":26,"noindex_google_only":26,"allow_follow":4,"published_at":27,"updated_at":27,"content_updated_at":28,"featured_image_url":29,"featured_image_alt":30,"card_image_url":31,"reading_time_minutes":32,"author":33,"categories":37,"tags":44,"alternates":45,"locale_paths":57,"views":58},175,"colly-purokushi-roteshon-gaido","Collyでのローテーティングプロキシ完全ガイド: Goスクレイパーの本番運用","Collyでのローテーティングプロキシの実装方法を解説。RoundRobinProxySwitcherとカスタムプロキシ関数でResidentialプロキシをリクエストごとに切り替え、ブロック回避と高スループットを実現する実践的なGoコード例を提供します。","\u003Ch2>Collyでのローテーティングプロキシの基本と重要性\u003C\u002Fh2>\u003Cp>Goでスクレイパーを構築した経験がある開発者なら、IPブロックやCAPTCHAに直面したことがあるはずです。Collyでのローテーティングプロキシは、この問題を解決する最も効果的な手段の一つです。各リクエストでIPを切り替えることで、ターゲットサイトのレート制限やIPベースのブロッキングを回避できます。\u003C\u002Fp>\u003Cp>\u003Cstrong>重要な法的注意事項:\u003C\u002Fstrong> 公開データの収集は多くの国で合法ですが、米国の\u003Ca href=\"https:\u002F\u002Fwww.law.cornell.edu\u002Fuscode\u002Ftext\u002F18\u002F1030\" rel=\"noopener noreferrer\">Computer Fraud and Abuse Act (CFAA)\u003C\u002Fa>やEUの\u003Ca href=\"https:\u002F\u002Fgdpr-info.eu\u002F\" rel=\"noopener noreferrer\">GDPR\u003C\u002Fa>など、適用される法律を遵守する必要があります。常にrobots.txtを尊重し、対象サイトの利用規約を確認し、個人情報を収集しないでください。本記事は技術的なガイドであり、法的助言ではありません。\u003C\u002Fp>\u003Ch2>Collyのコレクターモデルを理解する\u003C\u002Fh2>\u003Cp>CollyはGo言語のスクレイピングフレームワークで、コールバックベースのアーキテクチャを採用しています。中心となるのは \u003Ccode>*colly.Collector\u003C\u002Fcode> で、HTTPリクエストのライフサイクルに沿ったフックポイントを提供します。Collyの\u003Ca href=\"https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002Fgocolly\u002Fcolly\u002Fv2\" rel=\"noopener noreferrer\">公式ドキュメント\u003C\u002Fa>では、これらのコールバックを組み合わせて宣言的にスクレイピングロジックを構築するアプローチが推奨されています。\u003C\u002Fp>\u003Ch3>OnRequest \u002F OnHTML \u002F OnError コールバック\u003C\u002Fh3>\u003Cp>Collyの3つのコアコールバックを理解することが、プロキシローテーションの前提となります。\u003C\u002Fp>\u003Cpre>\u003Ccode>c := colly.NewCollector()\n\nc.OnRequest(func(r *colly.Request) {\n    fmt.Printf(&quot;Visiting: %s\\n&quot;, r.URL)\n})\n\nc.OnHTML(&quot;a[href]&quot;, func(e *colly.HTMLElement) {\n    link := e.Attr(&quot;href&quot;)\n    fmt.Printf(&quot;Link found: %s\\n&quot;, link)\n})\n\nc.OnError(func(r *colly.Response, err error) {\n    fmt.Printf(&quot;Error: %s — %v\\n&quot;, r.Request.URL, err)\n})\n\nc.Visit(&quot;https:\u002F\u002Fexample.com&quot;)\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Ccode>OnHTML\u003C\u002Fcode> コールバックは内部で\u003Ca href=\"https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002FPuerkitoBio\u002Fgoquery\" rel=\"noopener noreferrer\">goquery\u003C\u002Fa>を使用しており、CSS セレクタベースのDOMトラバーサルが可能です。\u003Ccode>OnRequest\u003C\u002Fcode> フックではリクエストヘッダーのカスタマイズができ、プロキシ設定のタイミングとしても重要です。\u003Ccode>OnError\u003C\u002Fcode> ではステータスコードに基づいたリトライロジックを実装できます。\u003C\u002Fp>\u003Ch3>非同期モードと並行処理\u003C\u002Fh3>\u003Cp>Collyは \u003Ccode>c.Async = true\u003C\u002Fcode> を設定することで非同期モードになります。このモードでは、複数のリクエストをゴルーチンで並行実行しますが、\u003Ccode>c.Wait()\u003C\u002Fcode> で完了を待機する必要があります。並行処理を行う場合は、プロキシのローテーションがスレッドセーフであることが重要です。後述するカスタムスイッチャーでは \u003Ccode>sync\u002Fatomic\u003C\u002Fcode> パッケージを使用して安全に実装します。\u003C\u002Fp>\u003Ch2>プロキシサーフェスの活用: colly proxy switcher\u003C\u002Fh2>\u003Cp>Collyはプロキシローテーションのための公式APIを提供しています。これらはフレームワークの拡張ポイントとして設計されており、ハックではありません。\u003C\u002Fp>\u003Ch3>RoundRobinProxySwitcher\u003C\u002Fh3>\u003Cp>\u003Ccode>proxy.RoundRobinProxySwitcher\u003C\u002Fcode> は、複数のプロキシエンドポイントを順番に使用するシンプルな実装です。Collyの \u003Ccode>proxy\u003C\u002Fcode> パッケージに含まれており、数行でプロキシローテーションを開始できます。\u003C\u002Fp>\u003Cpre>\u003Ccode>import &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fproxy&quot;\n\nswitcher, err := proxy.RoundRobinProxySwitcher(\n    &quot;http:\u002F\u002Fuser:pass@gate.proxyhat.com:8080&quot;,\n    &quot;http:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:8080&quot;,\n    &quot;http:\u002F\u002Fuser-country-US:pass@gate.proxyhat.com:8080&quot;,\n)\nif err != nil {\n    log.Fatal(err)\n}\nc.SetProxyFunc(switcher)\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Ccode>c.SetProxyFunc\u003C\u002Fcode> は \u003Ccode>func(*http.Request) (*url.URL, error)\u003C\u002Fcode> 型の関数を受け取ります。RoundRobinProxySwitcherはこの型を実装した関数を返すため、そのまま渡すことができます。HTTPプロキシとSOCKS5プロキシの両方を混在させることも可能です。SOCKS5を使用する場合は \u003Ccode>socks5:\u002F\u002Fuser:pass@gate.proxyhat.com:1080\u003C\u002Fcode> 形式で指定します。\u003C\u002Fp>\u003Ch3>カスタムプロキシ関数で動的ローテーション\u003C\u002Fh3>\u003Cp>より高度な制御が必要な場合は、独自のプロキシ関数を実装できます。これにより、リクエストごとに国、都市、セッションを動的に変更できます。これがgolang colly proxyパターンの本質です。\u003C\u002Fp>\u003Cpre>\u003Ccode>c.SetProxyFunc(func(r *http.Request) (*url.URL, error) {\n    sessionID := fmt.Sprintf(&quot;sess-%d&quot;, rand.Intn(10000))\n    proxyURL := fmt.Sprintf(\n        &quot;http:\u002F\u002Fuser-country-DE-region-state_of_berlin-city-berlin-sid-%s:pass@gate.proxyhat.com:8080&quot;,\n        sessionID,\n    )\n    return url.Parse(proxyURL)\n})\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>このパターンはCollyのイディオマティックな拡張ポイントです。\u003Ccode>SetProxyFunc\u003C\u002Fcode> が意図的に公開されたインターフェースであり、各リクエストの \u003Ccode>*http.Request\u003C\u002Fcode> にアクセスできるため、URLやヘッダーに基づいたプロキシ選択ロジックを自由に実装できます。\u003C\u002Fp>\u003Ch2>Residentialプロキシでハードターゲットに対応する\u003C\u002Fh2>\u003Ch3>なぜResidentialプロキシが必要なのか\u003C\u002Fh3>\u003Cp>Datacenterプロキシは高速ですが、IP範囲がデータセンターに属しているため、多くのサイトでブロックされます。一方、Residentialプロキシは実際のISPに登録されたIPアドレスを使用するため、通常のユーザーからのアクセスと区別が困難です。SERPトラッキングやECサイトの価格監視など、高度なボット検知システムを持つターゲットでは、Residentialプロキシが事実上必須となります。\u003Ca href=\"\u002Fja\u002Fuse-cases\u002Fserp-tracking\">SERPトラッキングのユースケース\u003C\u002Fa>について詳しくはこちらを参照してください。\u003C\u002Fp>\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>プロキシタイプ\u003C\u002Fth>\u003Cth>IPの性質\u003C\u002Fth>\u003Cth>成功率\u003C\u002Fth>\u003Cth>レイテンシ\u003C\u002Fth>\u003Cth>適した用途\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Residential\u003C\u002Ftd>\u003Ctd>ISP割り当てIP\u003C\u002Ftd>\u003Ctd>95%以上\u003C\u002Ftd>\u003Ctd>200-800ms\u003C\u002Ftd>\u003Ctd>SERPスクレイピング、ECサイト監視\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Datacenter\u003C\u002Ftd>\u003Ctd>データセンターIP\u003C\u002Ftd>\u003Ctd>50-70%\u003C\u002Ftd>\u003Ctd>50-200ms\u003C\u002Ftd>\u003Ctd>制限の緩いサイト、APIアクセス\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Mobile\u003C\u002Ftd>\u003Ctd>モバイルキャリアIP\u003C\u002Ftd>\u003Ctd>98%以上\u003C\u002Ftd>\u003Ctd>500-1500ms\u003C\u002Ftd>\u003Ctd>最高難度のターゲット、ソーシャル\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Ch3>国・都市・セッションローテーション\u003C\u002Fh3>\u003Cp>ProxyHatのResidentialプロキシでは、ユーザー名にフラグを追加することでジオターゲティングとセッション管理を行います。これにより、プロキシエンドポイントを変更せずに、ユーザー名のフォーマットだけでローテーション戦略を柔軟に切り替えられます。\u003C\u002Fp>\u003Cpre>\u003Ccode>\u002F\u002F ドイツ・ベルリンのIPを使用\nproxyURL := &quot;http:\u002F\u002Fuser-country-DE-region-state_of_berlin-city-berlin:pass@gate.proxyhat.com:8080&quot;\n\n\u002F\u002F スティッキーセッション（同じIPを30分間維持）\nproxyURL := &quot;http:\u002F\u002Fuser-sid-abc123:pass@gate.proxyhat.com:8080&quot;\n\n\u002F\u002F 国指定 + セッション（組み合わせ可能）\nproxyURL := &quot;http:\u002F\u002Fuser-country-US-sid-abc123:pass@gate.proxyhat.com:8080&quot;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>セッションIDを固定すると、指定した時間（通常30分間）同じIPアドレスが割り当てられます。ログインが必要なサイトのスクレイピングでは、セッション固定が必須です。一方、単純なページ収集ではセッションを毎回変更し、IPローテーションを最大化します。利用可能なロケーションについては\u003Ca href=\"\u002Fja\u002Flocations\">プロキシロケーション一覧\u003C\u002Fa>を参照してください。\u003C\u002Fp>\u003Ch2>完全な実装例: ResidentialプロキシでRoundRobin\u003C\u002Fh2>\u003Cp>以下は、ProxyHatのResidentialプロキシを使用した実践的なcolly web scrapingスクレイパーの完全例です。複数国のIPをラウンドロビンで切り替え、レート制限を設け、エラーハンドリングを実装しています。\u003C\u002Fp>\u003Cpre>\u003Ccode>package main\n\nimport (\n    &quot;fmt&quot;\n    &quot;log&quot;\n    &quot;math\u002Frand&quot;\n    &quot;time&quot;\n\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2&quot;\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fproxy&quot;\n)\n\nfunc main() {\n    c := colly.NewCollector(\n        colly.MaxDepth(2),\n        colly.UserAgent(&quot;Mozilla\u002F5.0 (compatible; MyBot\u002F1.0)&quot;),\n    )\n\n    \u002F\u002F プロキシエンドポイントリストを構築\n    proxyURLs := make([]string, 0, 5)\n    countries := []string{&quot;US&quot;, &quot;DE&quot;, &quot;GB&quot;, &quot;FR&quot;, &quot;JP&quot;}\n    for _, country := range countries {\n        u := fmt.Sprintf(\n            &quot;http:\u002F\u002Fuser-country-%s-sid-%d:pass@gate.proxyhat.com:8080&quot;,\n            country, rand.Intn(100000),\n        )\n        proxyURLs = append(proxyURLs, u)\n    }\n\n    \u002F\u002F ラウンドロビンスイッチャーを作成\n    switcher, err := proxy.RoundRobinProxySwitcher(proxyURLs...)\n    if err != nil {\n        log.Fatal(err)\n    }\n    c.SetProxyFunc(switcher)\n\n    \u002F\u002F レート制限を設定\n    c.Limit(&amp;colly.LimitRule{\n        DomainGlob:  &quot;*&quot;,\n        Delay:       2 * time.Second,\n        RandomDelay: 1 * time.Second,\n        Parallelism: 5,\n    })\n\n    c.OnHTML(&quot;h1&quot;, func(e *colly.HTMLElement) {\n        fmt.Printf(&quot;Title: %s\\n&quot;, e.Text)\n    })\n\n    c.OnError(func(r *colly.Response, err error) {\n        fmt.Printf(&quot;Error on %s: %v\\n&quot;, r.Request.URL, err)\n    })\n\n    c.OnRequest(func(r *colly.Request) {\n        fmt.Printf(&quot;Visiting: %s\\n&quot;, r.URL)\n    })\n\n    c.Visit(&quot;https:\u002F\u002Fexample.com&quot;)\n    c.Wait()\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>カスタムスイッチャーでリクエストごとに動的にローテーション\u003C\u002Fh3>\u003Cp>より細かい制御が必要な場合は、カスタムスイッチャーを実装します。\u003Ccode>sync\u002Fatomic\u003C\u002Fcode> を使用することで、ゴルーチンセーフなラウンドロビンを実現できます。Collyの非同期モードでも安全に動作します。\u003C\u002Fp>\u003Cpre>\u003Ccode>type ProxyRotator struct {\n    countries []string\n    proxies   []*url.URL\n    index     uint32\n}\n\nfunc NewProxyRotator(countries []string) *ProxyRotator {\n    proxies := make([]*url.URL, 0, len(countries))\n    for _, c := range countries {\n        u, _ := url.Parse(fmt.Sprintf(\n            &quot;http:\u002F\u002Fuser-country-%s:pass@gate.proxyhat.com:8080&quot;, c,\n        ))\n        proxies = append(proxies, u)\n    }\n    return &amp;ProxyRotator{countries: countries, proxies: proxies}\n}\n\nfunc (p *ProxyRotator) GetProxy(r *http.Request) (*url.URL, error) {\n    idx := atomic.AddUint32(&amp;p.index, 1)\n    return p.proxies[idx%uint32(len(p.proxies))], nil\n}\n\n\u002F\u002F 使用例\nrotator := NewProxyRotator([]string{&quot;US&quot;, &quot;DE&quot;, &quot;GB&quot;, &quot;FR&quot;, &quot;JP&quot;})\nc.SetProxyFunc(rotator.GetProxy)\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>この実装はCollyの設計思想に沿っています。\u003Ccode>SetProxyFunc\u003C\u002Fcode> が受け取る関数シグネチャ \u003Ccode>func(*http.Request) (*url.URL, error)\u003C\u002Fcode> に準拠し、リクエストコンテキストに基づいたプロキシ選択を可能にします。\u003C\u002Fp>\u003Ch2>本番運用パターン\u003C\u002Fh2>\u003Ch3>リトライと c.Clone()\u003C\u002Fh3>\u003Cp>Collyの \u003Ccode>c.Clone()\u003C\u002Fcode> を使用すると、コレクターの設定を引き継いだ新しいインスタンスを作成できます。HTTP 429（Too Many Requests）や503（Service Unavailable）を受信した際のリトライに役立ちます。\u003C\u002Fp>\u003Cpre>\u003Ccode>c.OnError(func(r *colly.Response, err error) {\n    if r.StatusCode == 429 || r.StatusCode == 503 {\n        retryCollector := c.Clone()\n        retryCollector.SetProxyFunc(func(req *http.Request) (*url.URL, error) {\n            sessionID := fmt.Sprintf(&quot;retry-%d&quot;, time.Now().UnixNano())\n            u := fmt.Sprintf(\n                &quot;http:\u002F\u002Fuser-sid-%s:pass@gate.proxyhat.com:8080&quot;,\n                sessionID,\n            )\n            return url.Parse(u)\n        })\n        time.Sleep(5 * time.Second)\n        retryCollector.Visit(r.Request.URL.String())\n    }\n})\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Ccode>c.Clone()\u003C\u002Fcode> はコールバック、DOMセレクタ、Limit設定をすべて引き継ぎますが、ストレージとプロキシ関数は引き継がないため、リトライ時に新しいプロキシ関数を明示的に設定できます。これは意図的な設計であり、リトライごとに新しいIPを強制するのに最適です。\u003C\u002Fp>\u003Ch3>RandomDelay と Parallelism の調整\u003C\u002Fh3>\u003Cp>\u003Ccode>c.Limit()\u003C\u002Fcode> で設定する \u003Ccode>RandomDelay\u003C\u002Fcode> は、リクエスト間隔にランダム性を加えます。これにより、ボット検知システムのパターンマッチングを回避できます。固定間隔のリクエストはボットの明確なシグナルとなるため、ランダム遅延は単なるオプションではなく必須の対策です。\u003C\u002Fp>\u003Cpre>\u003Ccode>c.Limit(&amp;colly.LimitRule{\n    DomainGlob:  &quot;example.com&quot;,\n    Delay:       3 * time.Second,\n    RandomDelay: 2 * time.Second,\n    Parallelism: 3,\n})\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>並行性を高めすぎるとターゲットサーバーに負荷をかけ、ブロックの原因になります。50並行から始めて、成功率を見ながら調整することをお勧めします。ProxyHatのResidentialプロキシは99.9%の稼働率を提供しますが、ターゲットサイト側の制限は別問題です。\u003C\u002Fp>\u003Ch3>カスタムTransport と TLS設定\u003C\u002Fh3>\u003Cp>一部のサイトではTLSフィンガープリントでボットを検知します。CollyのTransportをカスタマイズすることで、接続プールとTLS設定を調整できます。\u003C\u002Fp>\u003Cpre>\u003Ccode>import (\n    &quot;crypto\u002Ftls&quot;\n    &quot;net\u002Fhttp&quot;\n)\n\nc.WithTransport(&amp;http.Transport{\n    Proxy: http.ProxyFromEnvironment,\n    TLSClientConfig: &amp;tls.Config{\n        InsecureSkipVerify: false,\n        MinVersion:         tls.VersionTLS12,\n    },\n    MaxIdleConns:        100,\n    MaxIdleConnsPerHost: 10,\n    IdleConnTimeout:     90 * time.Second,\n})\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Ccode>MaxIdleConns\u003C\u002Fcode> と \u003Ccode>MaxIdleConnsPerHost\u003C\u002Fcode> を適切に設定することで、接続の再利用を最適化し、TCPハンドシェイクのオーバーヘッドを削減できます。ただし、プロキシローテーションを行う場合は、同じホストでもIPが変わるため、\u003Ccode>MaxIdleConnsPerHost\u003C\u002Fcode> は低めに設定する方が効果的です。\u003C\u002Fp>\u003Ch3>分散スクレイピング: Redisストレージバックエンド\u003C\u002Fh3>\u003Cp>複数のマシンでスクレイピングを分散する場合、CollyのストレージバックエンドをRedisに変更できます。これにより、訪問済みURLの重複を防ぎ、複数ワーカー間で状態を共有できます。\u003C\u002Fp>\u003Cpre>\u003Ccode>import &quot;github.com\u002Fgocolly\u002Fredisstorage&quot;\n\nstorage := &amp;redisstorage.Storage{\n    Address:  &quot;redis:6379&quot;,\n    Password: &quot;&quot;,\n    DB:       0,\n    Prefix:   &quot;scraper&quot;,\n}\nerr := c.SetStorage(storage)\nif err != nil {\n    log.Fatal(err)\n}\ndefer storage.Close()\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>コンテナ環境では、Docker ComposeやKubernetesでCollyワーカーを水平スケールし、Redisで状態を共有する構成が一般的です。各ワーカーに異なる国のプロキシを割り当てることで、地理的に分散したスクレイピングが可能です。100並行セッション程度までは単一ノードで処理できますが、それ以上のスループットが必要な場合は複数ノード構成を検討してください。\u003Ca href=\"\u002Fja\u002Fuse-cases\u002Fweb-scraping\">Webスクレイピングのユースケース\u003C\u002Fa>について詳しくはこちらを参照してください。\u003C\u002Fp>\u003Ch2>Collyを使うべきでないケースと倫理的配慮\u003C\u002Fh2>\u003Cp>Collyは軽量なHTTPクライアントベースのスクレイパーであり、JavaScript重視のSPA（Single Page Application）のレンダリングは行いません。以下のようなケースでは、ヘッドレスブラウザ（Chromium\u002FPuppeteer\u002FPlaywright）の使用を検討してください。\u003C\u002Fp>\u003Cul>\u003Cli>動的レンダリングが必要なSPA（React、Vue、Angular）\u003C\u002Fli>\u003Cli>ページネーションがJavaScriptで制御されるサイト\u003C\u002Fli>\u003Cli>無限スクロールのコンテンツ\u003C\u002Fli>\u003Cli>CAPTCHAトークンが必要なサイト\u003C\u002Fli>\u003C\u002Ful>\u003Cp>このような場合は、GoからPlaywrightを呼び出すか、別の言語でブラウザ自動化ツールを使用し、プロキシ設定だけProxyHatに任せるアプローチが現実的です。ProxyHatのプロキシはHTTP\u002FSOCKS5の両方をサポートしているため、どのツールとも互換性があります。詳細は\u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">ProxyHatドキュメント\u003C\u002Fa>を参照してください。\u003C\u002Fp>\u003Ch3>倫理的配慮とベストプラクティス\u003C\u002Fh3>\u003Cp>スクレイピングを行う際は以下の原則を守ってください。\u003C\u002Fp>\u003Col>\u003Cli>robots.txtを尊重する — \u003Ca href=\"https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fcrawling-indexing\u002Frobots\u002Fintro\" rel=\"noopener noreferrer\">Googleのガイドライン\u003C\u002Fa>に従い、robots.txtで禁止されたパスはクロールしない。\u003C\u002Fli>\u003Cli>\u003Cstrong>レート制限を守る\u003C\u002Fstrong> — ターゲットサーバーに過負荷をかけない適切な間隔を設定する。\u003C\u002Fli>\u003Cli>\u003Cstrong>公開データのみ収集\u003C\u002Fstrong> — ログイン背後のデータや個人情報は収集しない。\u003C\u002Fli>\u003Cli>\u003Cstrong>利用規約を確認\u003C\u002Fstrong> — 対象サイトのToSを確認し、スクレイピングが禁止されていないか確認する。\u003C\u002Fli>\u003Cli>\u003Cstrong>GDPR\u002FCCPAへの準拠\u003C\u002Fstrong> — EUやカリフォルニアのユーザーデータを扱う場合は、適用法規を確認する。\u003C\u002Fli>\u003C\u002Fol>\u003Ch2>Key Takeaways\u003C\u002Fh2>\u003Cblockquote>\u003Cul>\u003Cli>Collyの \u003Ccode>SetProxyFunc\u003C\u002Fcode> はプロキシローテーションの公式拡張ポイントであり、\u003Ccode>RoundRobinProxySwitcher\u003C\u002Fcode> とカスタム関数の両方が使える。\u003C\u002Fli>\u003Cli>Residentialプロキシは、ユーザー名に \u003Ccode>country-\u003C\u002Fcode> \u002F \u003Ccode>city-\u003C\u002Fcode> \u002F \u003Ccode>sid-\u003C\u002Fcode> フラグを追加するだけでジオターゲティングとセッション管理が可能。\u003C\u002Fli>\u003Cli>\u003Ccode>c.Limit()\u003C\u002Fcode> で \u003Ccode>RandomDelay\u003C\u002Fcode> と \u003Ccode>Parallelism\u003C\u002Fcode> を適切に設定し、ボット検知を回避する。\u003C\u002Fli>\u003Cli>\u003Ccode>c.Clone()\u003C\u002Fcode> でリトライ時の新しいセッション作成が可能。プロキシ関数は引き継がれないため、新しいIPを強制できる。\u003C\u002Fli>\u003Cli>Redisストレージバックエンドで分散スクレイピングが可能。コンテナ環境での水平スケールに対応。\u003C\u002Fli>\u003Cli>JavaScript重視のSPAにはCollyではなくヘッドレスブラウザを使用する。プロキシはProxyHatで引き続き対応可能。\u003C\u002Fli>\u003C\u002Ful>\u003C\u002Fblockquote>\u003Cp>ProxyHatのResidentialプロキシでCollyスクレイパーを本番運用する準備ができたら、\u003Ca href=\"\u002Fja\u002Fpricing\">プラン一覧\u003C\u002Fa>を確認して最適なプランを選択してください。\u003C\u002Fp>","Collyでローテーティングプロキシを実装する方法 | ProxyHat","Collyでのローテーティングプロキシの実装方法を徹底解説。RoundRobinProxySwitcherとカスタムプロキシ関数でResidentialプロキシをリクエストごとに切り替え、ブロック回避と高スループットを実現する実践的なGoコード例と本番運用パターンを収録。","\u002Fja\u002Fblog\u002Fcolly-purokushi-roteshon-gaido",null,"https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fcolly-purokushi-roteshon-gaido-og.webp",[17,20,23],{"question":18,"answer":19},"Collyでプロキシローテーションを使用する理由は何ですか？","単一IPで大量リクエストを送信すると、ターゲットサイトのレート制限やボット検知システムによってブロックされるためです。プロキシローテーションにより各リクエストが異なるIPから送信され、通常のユーザーアクセスと区別が困難になります。特にResidentialプロキシを使用すればISP割り当てのIPでアクセスできるため、Datacenterプロキシでは50-70%の成功率が95%以上に向上します。SERPスクレイピングやECサイト価格監視など、高度なボット検知を持つサイトでは必須の技術です。",{"question":21,"answer":22},"Collyのプロキシローテーションに最適なプロキシタイプは何ですか？","ターゲットの難易度によって異なります。一般的にはResidentialプロキシが最適です。ISP割り当てのIPアドレスを使用するため、通常ユーザーと区別が困難で、成功率が95%以上に達します。レイテンシは200-800msとDatacenterより高いですが、ブロック回避の観点では圧倒的に優位です。最高難度のターゲット（ソーシャルメディアなど）ではMobileプロキシ（成功率98%以上）を検討してください。制限の緩いサイトやAPIアクセスでは、低レイテンシのDatacenterプロキシでも十分な場合があります。",{"question":24,"answer":25},"Collyでブロックを回避するにはどうすればよいですか？","複数の対策を組み合わせる必要があります。まず、ResidentialプロキシでリクエストごとにIPをローテーションします。次に、c.Limit()でRandomDelayを設定し、リクエスト間隔にランダム性を持たせます。固定間隔のリクエストはボットの明確なシグナルです。また、c.Clone()を使用してHTTP 429や503を受信時に新しいセッションIDでリトライします。さらに、適切なUser-Agentヘッダーを設定し、カスタムTransportでTLS設定を調整することで、TLSフィンガープリント検知も回避できます。並行性は50並行程度から始め、成功率を監視しながら調整してください。",false,"2026-08-04T10:05:34+00:00","2026-10-03T08:57:49+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fcolly-purokushi-roteshon-gaido-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fcolly-purokushi-roteshon-gaido-card.webp",12,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[38],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},4,"kaihatsusha-gaido","開発者ガイド","開発者ガイド | ProxyHat ブログ","プロキシをアプリケーションに統合するためのコードチュートリアルとSDKガイド。",[],{"es":46,"ru":47,"ja":13,"pt":48,"pl":49,"ko":50,"tr":51,"zh":52,"it":53,"de":54,"en":55,"fr":56,"x-default":55},"\u002Fes\u002Fblog\u002Frotacion-proxies-colly-golang-1","\u002Fru\u002Fblog\u002Frotaciya-proksi-v-colly-1","\u002Fpt\u002Fblog\u002Fproxies-rotativos-em-colly","\u002Fpl\u002Fblog\u002Frotacja-proxy-w-colly-1","\u002Fko\u002Fblog\u002Fcolly-rotating-proxy-guide","\u002Ftr\u002Fblog\u002Fcolly-doner-proxy-rehberi","\u002Fcn\u002Fblog\u002Fcolly-lunhuan-daili-shixian-zhinan","\u002Fit\u002Fblog\u002Fproxy-rotanti-in-colly-guida","\u002Fde\u002Fblog\u002Frotierende-proxies-in-colly","\u002Fblog\u002Frotating-proxies-in-colly-golang","\u002Ffr\u002Fblog\u002Frotation-proxies-colly-golang-1",{"es":46,"ru":47,"ja":13,"pt":48,"pl":49,"ko":50,"tr":51,"zh":52,"it":53,"de":54,"en":55,"fr":56},71,[60,75,91,107],{"id":61,"slug":62,"title":63,"excerpt":64,"featured_image_url":65,"featured_image_alt":66,"card_image_url":67,"og_image_url":68,"published_at":69,"updated_at":69,"content_updated_at":28,"reading_time_minutes":32,"is_featured":26,"indexable":4,"views":70,"author":71,"categories":72,"tags":74},176,"got-scraping-nodejs-purokishi","Node.jsでgot-scrapingを使ったプロキシ連携の完全ガイド","got-scrapingのheader-generatorとProxyHatレジデンシャルプロキシを組み合わせ、Node.jsでブロックされないスクレイピングを構築する方法を解説。実践的なコード例付き。","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fgot-scraping-nodejs-purokishi-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fgot-scraping-nodejs-purokishi-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fgot-scraping-nodejs-purokishi-og.webp","2026-08-04T16:05:06+00:00",121,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[73],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[],{"id":76,"slug":77,"title":78,"excerpt":79,"featured_image_url":80,"featured_image_alt":81,"card_image_url":82,"og_image_url":83,"published_at":84,"updated_at":84,"content_updated_at":85,"reading_time_minutes":32,"is_featured":26,"indexable":4,"views":86,"author":87,"categories":88,"tags":90},195,"bybit-v5-market-api-proxy-scraping","暗号資産取引所の市場データをローテーションプロキシで収集する完全ガイド（Bybit V5 APIの例）","Bybit V5 Market APIのorderbook・tickers・klineエンドポイントをローテーションプロキシ経由でスクレイピングする方法を、Node.js・Pythonのコード例とともに解説。レート制限・地域制限の回避策もカバーします。","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fbybit-v5-market-api-proxy-scraping-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fbybit-v5-market-api-proxy-scraping-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fbybit-v5-market-api-proxy-scraping-og.webp","2026-08-03T16:09:16+00:00","2026-10-04T01:29:51+00:00",87,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[89],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[],{"id":92,"slug":93,"title":94,"excerpt":95,"featured_image_url":96,"featured_image_alt":97,"card_image_url":98,"og_image_url":99,"published_at":100,"updated_at":100,"content_updated_at":101,"reading_time_minutes":32,"is_featured":26,"indexable":26,"views":102,"author":103,"categories":104,"tags":106},194,"binance-api-scraping-proxy","Binance REST APIをプロキシでスクレイピングする完全ガイド","Binanceの公開マーケットデータREST APIをプロキシ経由で大規模収集する方法を、エンドポイント別のウェイト制限、IPローテーション、リトライ戦略まで含めて解説します。","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fbinance-api-scraping-proxy-master.webp","How to Scrape the Binance REST API with Proxies: A Developer Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fbinance-api-scraping-proxy-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fbinance-api-scraping-proxy-og.webp","2026-08-03T10:04:04+00:00","2026-10-03T08:21:25+00:00",82,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[105],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[],{"id":108,"slug":109,"title":110,"excerpt":111,"featured_image_url":112,"featured_image_alt":113,"card_image_url":114,"og_image_url":115,"published_at":116,"updated_at":116,"content_updated_at":117,"reading_time_minutes":32,"is_featured":26,"indexable":26,"views":118,"author":119,"categories":120,"tags":122},172,"swift-urlsession-proxy-guide","Swiftでプロキシを使用する完全ガイド：URLSessionで residential プロキシを活用する方法","iOS・macOS開発者向けに、SwiftのURLSessionでresidentialプロキシを設定・認証・活用する実践的なコードファーストガイド。ProxyHatゲートウェイを使ったHTTP\u002FSOCKS5構成、async\u002Fawait並行処理、本番運用のベストプラクティスまで網羅。","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fswift-urlsession-proxy-guide-master.webp","Using Proxies in Swift: A Code-First Guide to URLSession, SOCKS5 & Residential IPs","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fswift-urlsession-proxy-guide-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fja\u002Fswift-urlsession-proxy-guide-og.webp","2026-07-26T16:03:44+00:00","2026-10-03T23:53:00+00:00",234,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[121],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[],[]]