Goプロキシサーバー – Go Guideでプロキシサーバーを設定する

この記事では、GoでWebスクレイピング用のプロキシサーバーをセットアップする方法について説明します。
14 min read
Setting Proxy in GO

インターネットを使って情報をやり取りするには、必ずIPアドレスが必要です。WebサイトはこのIPアドレスを使用してユーザーを識別し、ユーザーの位置情報やその他のメタデータ(ISP、タイムゾーン、デバイスタイプなど)を特定します。Webサーバーはこれらの情報を利用して、コンテンツやリソースを調整したり制限したりできます。つまり、Webサイトは、Webスクレイピング時のトラフィックパターンや動作に何らかの異常性、ボットの特性、あるいは悪意があると判断した場合、そのIPアドレスから送信されたリクエストをブロックできるのです。この問題を解決するのがプロキシサーバーです。

プロキシサーバーとは、ユーザーとインターネットの中間にあってゲートウェイとして機能するサーバーのことで、ユーザーからリクエストを受け取ってWebリソースに転送し、取得したデータをユーザーに返します。プロキシサーバーによって発信元のIPアドレスが隠され、セキュリティ、プライバシー、匿名性が高まるので、閲覧やスクレイピングを慎重に行うことができます。

プロキシサーバーには、IPアドレスを適宜変更して、リクエストがさまざまなユーザーから来ているように見せかける機能があり、IPバン(接続禁止)を回避するのにも役立ちます。さまざまな地域にあるプロキシサーバーを使用すれば、ジオブロッキングを迂回して、映画やニュースなど地域固有のコンテンツにアクセスできます。

この記事では、GoでWebスクレイピング用のプロキシサーバーをセットアップする方法について説明します。Bright Dataプロキシサーバーでこのプロセスをどのように簡素化できるかについてもお分かりいただけるでしょう。

プロキシサーバーをセットアップする

このチュートリアルでは、Goで記述されたWebスクレイパーアプリケーションを変更して、ローカルまたはセルフホストのプロキシサーバー経由でIt’s FOSSのWebサイトとやり取りするまでを学習します。Go開発環境はセットアップ済みであることが前提です。

最初に、オープンソースのプロキシサーバーソフトウェアSquidを使用してプロキシサーバーをセットアップする必要があります。使い慣れているプロキシサーバーソフトウェアが他にあるなら、それを使ってもかまいません。次の記事では、Fedora 39 LinuxマシンでSquidを使用します。Squidは、ほとんどのLinuxディストリビューションのデフォルトリポジトリに含まれています。マニュアルを参照して、お使いのオペレーティングシステムに必要なパッケージをダウンロードすることもできます。

端末から次のコマンドを実行してSquidをインストールします。

dnf install squid -y

完了したら、次のコマンドを実行してサービスを開始します。

sudo systemctl enable --now squid

次のコマンドを使用してサービスのステータスを確認してください。

sudo systemctl status squid

出力は次のようになります。

Goプロキシサーバー

これは、サービスが有効で実行中であることを示します。デフォルトでは、Squidはポート3128で実行され、リクエストを受け取ります。次のcurlコマンドを使用して、プロキシサーバー経由の通信をテストしてください。

curl --proxy 127.0.0.1:3128 "http://lumtest.com/myip.json"

次のような応答が返ってくればOKです。

curl --proxy 127.0.0.1:3128 "http://lumtest.com/myip.json"
{"ip":"196.43.196.126","country":"GH","asn":{"asnum":327695,"org_name":"AITI"},"geo":{"city":"","region":"","region_name":"","postal_code":"","latitude":8.1,"longitude":-1.2,"tz":"Africa/Accra"}}

メタデータにはパブリックIPアドレス、および所有者の国と組織が含まれているので、正常に動作するプロキシサーバーがインストールされていることも確認できました。

デモ用スクレイパーをセットアップする

わかりやすくするために、このGitHubリポジトリにあるシンプルなGo Webスクレイパーアプリケーションを使います。このスクレイパーは、オープンソースソフトウェア製品について話し合う人気ブログIt’s FOSSの最新の投稿のタイトル、抜粋、カテゴリを取り込みます。次に、スクレイパーはLumtestにアクセスして、スクレイパーのHTTPクライアントがWebとのやり取りに使用するIPアドレスに関する情報を取得します。Colly、goquery、Seleniumという異なる3つのGoパッケージで同じロジックが実装されます。次のセクションでは、プロキシサーバーを使用するように各実装を変更する方法について説明します。

最初に、お気に入りの端末/シェルで次のコマンドを実行して、リポジトリを複製します。

$ git clone https://github.com/rexfordnyrk/go_scrap_proxy.git

このリポジトリは、完成したコードを含むメインブランチと、変更対象の初期コードを含むbasicブランチの2つのブランチで構成されています。次のコマンドを使って、basicブランチにチェックアウトします。

$ git checkout basic

このブランチでは、プロキシが設定されていないスクレイパーのライブラリ実装ごとに3つの.goファイルが含まれています。実行ファイルchromedriverも含まれていますが、これはスクレイパーのSelenium実装に必要です。

.
├── chromedriver
├── colly.go
├── go.mod
├── goquery.go
├── go.sum
├── LICENSE
├── README.md
└── selenium.go

1 directory, 8 files

特定のファイル名でgo runコマンドを使用すると、どの実装も個別に実行できます。たとえば、次のコマンドはCollyでスクレイパーを実行します。

go run ./colly.go 

出力は次のようになります。

$ go run ./colly.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:29614 org_name:VODAFONE GHANA AS INTERNATIONAL TRANSIT] country:GH geo:map[city:Accra latitude:5.5486 longitude:-0.2012 lum_city:accra lum_region:aa postal_code: region:AA region_name:Greater Accra Region tz:Africa/Accra] ip:197.251.144.148]

It’s FOSSからスクレイピングされた記事情報がすべて出力されます。出力の最後には、スクレイパーが使用している現在の接続について、Lumtestから返されたIP情報が表示されます。3つの実装すべてで、同様の実行結果が得られるはずです。3つのテストがすべて完了したら、ローカルプロキシを使ったスクレイピングをすぐに開始できます。

ローカルプロキシを使うスクレイパーを実装する

このセクションでは、スクレイパーの3つの実装について説明し、各スクレイパーでプロキシサーバーを使用するように変更していきます。各.goファイルは、アプリケーションを起動するmain()関数と、スクレイピングの指示が記述されているScrapeWithLibrary()関数で構成されています。

goqueryでローカルプロキシを使う

goqueryはGo用のライブラリで、JavaScriptに対するjQueryの働きと同様に、HTMLドキュメントを解析して操作するための一連のメソッドと機能を提供します。このライブラリは、HTMLページの構造をトラバース、クエリ、操作できるのでWebスクレイピングに特に役立ちますが、ネットワークに対するリクエストや操作を一切行わないため、HTMLページを取得して提供する責任は呼び出し側にあります。

goquery.goファイルに移動して、Webスクレイパーのgoquery実装を確認できます。使い慣れたIDEやテキストエディタで開いてください。

ScrapeWithGoQuery()関数内で、HTTPクライアントのトランスポートをHTTPプロキシサーバーのURLで変更する必要があります。URL は、http://HOST:PORTという形式のホスト名またはIPとポートの組み合わせです。

このファイルにnet/urlパッケージを必ずインポートしてください。HTTPクライアント定義を貼り付けて、次のスニペットに置き換えます。

...

func ScrapeWithGoquery() {
    // Define the URL of the proxy server
    proxyStr := "http://127.0.0.1:3128"

    // Parse the proxy URL
    proxyURL, err := url.Parse(proxyStr)
    if err != nil {
        fmt.Println("Error parsing proxy URL:", err)
        return
    }

    //Create an http.Transport that uses the proxy
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }

    // Create an HTTP client with the transport
    client := &http.Client{
        Transport: transport,
    }
    
... 

このスニペットは、ローカルプロキシサーバーを使用するように設定されたトランスポートでHTTPクライアントを変更します。IPアドレスは必ずプロキシサーバーのIPアドレスに置き換えてください。

次に、プロジェクトディレクトリから次のコマンドを使用してこの実装を実行します。

go run ./goquery.go

出力は次のようになります。

$ go run ./goquery.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:29614 org_name:VODAFONE GHANA AS INTERNATIONAL TRANSIT] country:GH geo:map[city:Accra latitude:5.5486 longitude:-0.2012 lum_city:accra lum_region:aa postal_code: region:AA region_name:Greater Accra Region tz:Africa/Accra] ip:197.251.144.148]

Collyでローカルプロキシを使う

CollyはGo用の多用途で効率的なWebスクレイピングフレームワークで、使いやすいAPIや、goqueryなどのHTML解析ライブラリとシームレスに統合できることが特長です。goqueryとは異なり、高速スクレイピング、ローカルキャッシュ、レート制限の非同期リクエストなど、ネットワーク関連のさまざまな動作を処理するためのAPIをサポートおよび提供します。これによって、Webリソースの効率的かつ責任ある使用、Cookieとセッションの自動処理、カスタマイズ可能なユーザーエージェント、包括的なエラー処理が保証されます。プロキシの切り替えやローテーションを行いながらプロキシを使用することもできます。ヘッドレスブラウザーと統合すれば、JavaScriptで生成されたコンテンツのスクレイピングなどのタスクにも拡張できます。

colly.goファイルをエディタかIDEで開き、ScrapeWithColly()関数内で新しいコレクタを初期化した直後に、次のコードを貼り付けてください。

...
    // Define the URL of the proxy server
    proxyStr := "http://127.0.0.1:3128"
    // SetProxy sets a proxy for the collector
    if err := c.SetProxy(proxyStr); err != nil {
        log.Fatalf("Error setting proxy configuration: %v", err)
    }
    
...

このスニペットはCollyのsetProxy()メソッドを使用して、このコレクタインスタンスでネットワークリクエストに使用されるプロキシサーバーを定義します。

次に、プロジェクトディレクトリから次のコマンドを使用してこの実装を実行します。

go run ./colly.go

出力は次のようになります。

$ go run ./colly.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:29614 org_name:VODAFONE GHANA AS INTERNATIONAL TRANSIT] country:GH geo:map[city:Accra latitude:5.5486 longitude:-0.2012 lum_city:accra lum_region:aa postal_code: region:AA region_name:Greater Accra Region tz:Africa/Accra] ip:197.251.144.148]

Seleniumでローカルプロキシを使う

Seleniumは、WebアプリケーションのテストでWebブラウザーとのやり取りを自動化するために主に使用されるツールです。ボタンのクリック、テキストの入力、Webページからのデータの抽出などのタスクを実行できるので、やり取りを自動化してWebコンテンツをスクレイピングするのに最適です。ユーザーの実際の対話操作の模倣は、Seleniumがブラウザーのコントロールに使用するWebDriverを介して可能になります。この例ではChromeを使用していますが、SeleniumはFirefox、Safari、Internet Explorerなどの他のブラウザもサポートしています。

Selenium WebDriverサービスでは、Webとのやり取りの基盤となるブラウザーの動作に影響を与えるプロキシやその他の構成を、実際のブラウザーとまったく同様に設定できます。プログラムからは、selelium.Capabilities{}定義を使用して設定できます。

Seleniumでローカルプロキシを使用するには、selenium.goファイルをエディタで開き、ScrapeWithSelenium()内のSelelium.Capabilities{}定義を次のスニペットに置き換えます。

...

    // Define proxy settings
    proxy := selenium.Proxy{
        Type: selenium.Manual,
        HTTP: "127.0.0.1:3128", // Replace with your proxy settings
        SSL:  "127.0.0.1:3128", // Replace with your proxy settings
    }

    // Configuring the WebDriver instance with the proxy
    caps := selenium.Capabilities{
        "browserName": "chrome",
        "proxy":       proxy,
    }
    
...

このスニペットは、Seleniumのさまざまなプロキシパラメーターを定義しており、これがWebDriver用のSeleniumの機能の設定に使用されます。 次回の実行では、このプロキシ接続が使用されます。

次に、プロジェクトディレクトリから次のコマンドを使用して実装を実行します。

go run ./selenium.go

出力は次のようになります。

$ go run ./selenium.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP {"ip":"197.251.144.148","country":"GH","asn":{"asnum":29614,"org_name":"VODAFONE GHANA AS INTERNATIONAL TRANSIT"},"geo":{"city":"Accra","region":"AA","region_name":"Greater Accra Region","postal_code":"","latitude":5.5486,"longitude":-0.2012,"tz":"Africa/Accra","lum_city":"accra","lum_region":"aa"}}

プロキシサーバーは自分でメンテナンスできるとはいえ、多くの地域向けの新しいサーバーのセットアップ、その他のメンテナンス作業、セキュリティの問題など、さまざまな要因による制限があります。

Bright Dataプロキシサーバー

プロキシサーバーとサービスの包括的なセットを備えた、受賞歴のあるBright Dataグローバルプロキシネットワークインフラストラクチャを、さまざまなWebデータ収集用途にぜひご利用ください。

Bright Dataプロキシサーバーの広範なグローバルネットワークを利用すれば、国境を越えたさまざまな場所から簡単にアクセスしてデータを収集できます。Bright Dataは、3億5,000万を超える他に類を見ない住宅用ISP用データセンター用モバイル用プロキシをはじめとして、多様なタイプのプロキシを提供しています。これらにはそれぞれ、合法性、速度、信頼性などの固有の利点があり、Webデータ収集タスクの特性に合わせてお選びいただけます。

加えて、Bright Dataプロキシローテーションシステムは高い匿名性を保証し、検出される可能性を最小限にできるため、継続的かつ大規模なWebデータ収集に最適です。

Bright Dataの住宅用プロキシを設定する

Bright Dataの住宅用プロキシは簡単に取得できます。無料トライアルにサインアップしてぜひお試しください。サインアップすると、次のような画面になります。

BDダッシュボード

住宅用プロキシ開始ボタンをクリックしてください。

以下のフォームに入力するよう求められます。

Bright Data住宅用プロキシのセットアップ

このインスタンスの名前を指定します。ここでは、my_go_demo_proxyにしましょう。プロビジョニングするIPタイプを指定する必要があります。共有を選択してください (共有プロキシを使用する場合)。次に、Webコンテンツのアクセス時に位置情報を変更するレベルを指定します。デフォルトでは、これはレベルまたはゾーンです。リクエストしたWebページをキャッシュするかどうかを指定する必要もあります。今は、キャッシュを無効にしましょう。

この情報を入力したら、追加をクリックします。住宅用プロキシの作成とプロビジョニングが行われます。

次に、住宅用プロキシを有効にする必要があります。新規ユーザーの場合は、まず請求先情報の入力を求められます。この手順が完了したらダッシュボードに移動し、作成した住宅用プロキシをクリックします。

goでプロキシを設定する

アクセスパラメータータブが選択されていることを確認します。

ここに、ホスト、ポート、認証情報など、住宅用プロキシの利用に必要なさまざまなパラメーターが表示されます。この情報はすぐに必要になります。

ここからいよいよ、スクレイパーの3つの実装にBright Data住宅用プロキシを統合していきます。ローカルサーバーの場合と作業が似ていますが、認証が含まれる点が異なります。また、プログラムでWebとやり取りするので、グラフィカルユーザーインターフェイスを備えたブラウザーでの操作とは異なり、プロキシサーバーからのSSL証明書を確認して受け入れることができない可能性があります。そのため、Webクライアント側のプログラムでSSL証明書の検証を無効にして、リクエストが中断されないようにする必要があります。

まず、プロジェクトディレクトリにbrightdataというディレクトリを作成し、3つの.goファイルをbrightdataディレクトリにコピーします。次のようなディレクトリ構造になります。

.
├── brightdata
│   ├── colly.go
│   ├── goquery.go
│   └── selenium.go
├── chromedriver
├── colly.go
├── go.mod
├── goquery.go
├── go.sum
├── LICENSE
├── README.md
└── selenium.go

2 directories, 11 files

これから変更するのは、brightdataディレクトリ内のファイルです。

goqueryでBright Data住宅用プロキシを使う

ScrapeWithGoQuery()関数内でProxyStr変数を変更し、認証資格情報をプロキシのURLに含める必要があります。形式は、http://USERNAME:PASSWORD@HOST:PORTです。現在の定義を次のスニペットに置き換えてください。

...

func ScrapeWithGoquery() {
    // Define the proxy server with username and password
    proxyUsername := "username" //Your residential proxy username 
    proxyPassword := "your_password" //Your Residential Proxy password here
    proxyHost := "server_host" //Your Residential Proxy Host
    proxyPort := "server_port"  //Your Port here
    
    proxyStr := fmt.Sprintf("http://%s:%s@%s:%s", url.QueryEscape(proxyUsername), url.QueryEscape(proxyPassword), proxyHost, proxyPort)
    
    // Parse the proxy URL
...

次に、HTTPクライアントのトランスポートを変更して、プロキシサーバーのSSL/TLS証明書の検証を無視する設定にする必要があります。まず、crypto/tlsパッケージをインポートに追加します。次に、プロキシのURLを解析し、http.Transport定義を次のスニペットに置き換えます。

...

func ScrapeWithGoquery() {
    
    // Parse the proxy URL
...

    //Create an http.Transport that uses the proxy
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true, // Disable SSL certificate verification
        },
    }

    // Create an HTTP client with the transport
... 

このスニペットは、ローカルプロキシサーバーを使用するように設定されたトランスポートでHTTPクライアントを変更します。IPアドレスは必ずプロキシサーバーのIPアドレスに置き換えてください。

次に、プロジェクトディレクトリから次のコマンドを使用してこの実装を実行します。

go run brightdata/goquery.go 

出力は次のようになります。

$ go run brightdata/goquery.go 

Article 0: {"category":"Newsletter ✉️","excerpt":"Open source rival to Twitter, a hyped new terminal and a cool new Brave/Chrome feature among many other things.","title":"FOSS Weekly #24.07: Fedora Atomic Distro, Android FOSS Apps, Mozilla Monitor Plus and More"}
Article 1: {"category":"Explain","excerpt":"Intel makes things confusing, I guess. Let's try making the processor naming changes simpler.","title":"Intel Processor Naming Changes: All You Need to Know"}
Article 2: {"category":"Linux Commands","excerpt":"The Cut command lets you extract a part of the file to print without affecting the original file. Learn more here.","title":"Cut Command Examples"}
Article 3: {"category":"Raspberry Pi","excerpt":"A UART attached to your Raspberry Pi can help you troubleshoot issues with your Raspberry Pi. Here's what you need to know.","title":"Using a USB Serial Adapter (UART) to Help Debug Your Raspberry Pi"}
Article 4: {"category":"Newsletter ✉️","excerpt":"Damn Small Linux resumes development after 16 years.","title":"FOSS Weekly #24.06: Ollama AI, Zorin OS Upgrade, Damn Small Linux, Sudo on Windows and More"}
Article 5: {"category":"Tutorial","excerpt":"Zorin OS now provides a way to upgrade to a newer major version. Here's how to do that.","title":"How to upgrade to Zorin OS 17"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you’re using? Here’s how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:7922 org_name:COMCAST-7922] country:US geo:map[city:Crown Point latitude:41.4253 longitude:-87.3565 lum_city:crownpoint lum_region:in postal_code:46307 region:IN region_name:Indiana tz:America/Chicago] ip:73.36.77.244]

同じ記事をスクレイピングしているのに、異なる結果がプロキシIPチェックから返されたことがわかるでしょう。別の場所または国からアクセスされたからです。

CollyでBright Data住宅用プロキシを使う

CollyにはSSL/TLS検証をプログラムで無効にするメソッドがありませんが、ユーザー固有のトランスポートを提供して、それがHTTPクライアントで使用されるようにする方法はあります。

colly.goファイルをエディタかIDEで開き、ScrapeWithColly()関数内で新しいコレクタを初期化した後に、次のコードを貼り付けてください (net/urlnet/httpのインポートを追加することを忘れないでください)。

...
func ScrapeWithColly() {
    ...
    
    //Create an http.Transport that uses the proxy
    transport := &http.Transport{
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true, // Disable SSL certificate verification
        },
    }
    
    // Set the collector instance to use the configured transport
    c.WithTransport(transport)
    
    
...

このスニペットでは、SSL検証を無効化したHTTPトランスポートを定義し、Colly withTransport()メソッドを使用して、ネットワークリクエストを行うコレクタのトランスポートを設定しています。

ProxyStr変数を変更し、住宅用プロキシの認証情報を格納します (goqueryで行ったのと同様)。ProxyStr行を次のスニペットに置き換えてください。

...

    // Define the proxy server with username and password
    proxyUsername := "username" //Your residential proxy username 
    proxyPassword := "your_password" //Your Residential Proxy password here
    proxyHost := "server_host" //Your Residential Proxy Host
    proxyPort := "server_port"  //Your Port here

    proxyStr := fmt.Sprintf("http://%s:%s@%s:%s", url.QueryEscape(proxyUsername), url.QueryEscape(proxyPassword), proxyHost, proxyPort)

...

文字列値を、住宅用プロキシのアクセスパラメーターページにある値に置き換えることを忘れないでください。

次に、プロジェクトディレクトリから次のコマンドを使用してこの実装を実行します。

go run brightdata/colly.go
go run brightdata/colly.go 
…

Check Proxy IP map[asn:map[asnum:2856 org_name:British Telecommunications PLC] country:GB geo:map[city:Turriff latitude:57.5324 longitude:-2.3883 lum_city:turriff lum_region:sct postal_code:AB53 region:SCT region_name:Scotland tz:Europe/London] ip:86.180.236.254]

出力の「Check Proxy IP」を見ると、同じ認証情報が使用されているのに国が違うことがわかるでしょう。

SeleniumでBright Data住宅用プロキシを使う

Seleniumで使用する場合は、認証情報を含むプロキシURL文字列を使用するようにSelenium.Proxy{}定義を変更する必要があります。現在のプロキシ定義を次の内容に置き換えてください。

...

    // Define the proxy server with username and password
    proxyUsername := "username"      //Your residential proxy username
    proxyPassword := "your_password" //Your Residential Proxy password here
    proxyHost := "server_host"       //Your Residential Proxy Host
    proxyPort := "server_port"       //Your Port here

    proxyStr := fmt.Sprintf("http://%s:%s@%s:%s", url.QueryEscape(proxyUsername), url.QueryEscape(proxyPassword), proxyHost, proxyPort)

    // Define proxy settings
    proxy := selenium.Proxy{
        Type: selenium.Manual,
        HTTP: proxyStr,
        SSL:  proxyStr,
    }
    
...

net/urlパッケージのインポートを忘れないでください。

さまざまなプロキシパラメーターが定義されたこのスニペットがマージされて、プロキシ設定で使用されるプロキシURLが作成されます。

住宅用プロキシはこれまでに説明した実装と同様に設定されましたが、ここでは、SSL検証を無効にするオプションをChrome WebDriverに設定する必要があります。そのためにChromeCaps定義の引数を変更して、次のように--ignore-certificate-errorsオプションを追加します。

... 
    caps.AddChrome(chrome.Capabilities{Args: []string{
        "--headless=new", // Start browser without UI as a background process
        "--ignore-certificate-errors", // // Disable SSL certificate verification
    }})
...

Seleniumは、デフォルトでは認証されたプロキシ構成をサポートしませんが、認証されたプロキシ接続用のChrome拡張機能をビルドする小さなパッケージを使用して、この問題を回避できます。

まず、このgo getコマンドを使用して、そのパッケージをプロジェクトに追加します。

go get https://github.com/rexfordnyrk/proxyauth

次に、パッケージをbrightdata/selenium.goファイルにインポートします。ファイル先頭のインポートブロックにgithub.com/rexfordnyrk/proxyauth行を追加してください。

次に、proxyauthパッケージのBuildExtension()メソッドでChrome拡張機能をビルドして、Bright Data住宅用プロキシの認証情報と一緒に渡す必要があります。そのために、chromeCaps定義の後、caps.AddChrome(chromeCaps)行の前に、次のコードスニペットを貼り付けてください。

…
    //Building proxy auth extension using BrightData Proxy credentials
    extension, err := proxyauth.BuildExtention(proxyHost, proxyPort, proxyUsername, proxyPassword)
    if err != nil {
        log.Fatal("BuildProxyExtension Error:", err)
    }

    //including the extension to allow proxy authentication in chrome
    if err := chromeCaps.AddExtension(extension); err != nil {
        log.Fatal("Error adding Extension:", err)
    }

…

このスニペットでChrome拡張機能が作成され、Chrome WebDriverに追加されます。これにより、提供されたプロキシ認証情報を介して、認証されたWebリクエストが有効になります。

プロジェクトディレクトリから次のコマンドを使用してこの実装を実行します。

go run brightdata/selenium.go

出力は次のようになります。

$ go run brightdata/selenium.go 

Article 0: {"categoryText":"Newsletter ✉️","excerpt":"Check out the promising new features in Ubuntu 24.04 LTS and a new immutable distro.","title":"FOSS Weekly #24.08: Ubuntu 24.04 Features, Arkane Linux, grep, Fedora COSMIC and More"}
…
Article 8: {"categoryText":"Ubuntu","excerpt":"Wondering which Ubuntu version you’re using? Here’s how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP {"ip":"176.45.169.166","country":"SA","asn":{"asnum":25019,"org_name":"Saudi Telecom Company JSC"},"geo":{"city":"Riyadh","region":"01","region_name":"Riyadh Region","postal_code":"","latitude":24.6869,"longitude":46.7224,"tz":"Asia/Riyadh","lum_city":"riyadh","lum_region":"01"}}

ここでも、出力の最後にあるIP情報を見てください。リクエストの送信に別の国が使用されていることがわかるでしょう。これは、Bright Dataプロキシローテーションシステムが動作している様子です。

ここまで見てきたとおり、Bright DataはGoアプリケーションで簡単に利用できます。最初に、Bright Dataプラットフォームで住宅用プロキシを作成し、認証情報を取得します。次に、その情報を使用して、Webでプロキシを使用するようにコードを変更します。

まとめ

Webプロキシサーバーは、インターネットでのやり取りをカスタマイズするための非常に重要なコンポーネントです。この記事では、プロキシサーバーについて、およびSquidを使用したセルフホストのプロキシサーバーをセットアップする方法について、その全体を学びました。ローカルプロキシサーバーをGoアプリケーション (今回はWebスクレイパー) に統合する方法についても説明しました。

プロキシサーバーの利用にご関心がおありでしたら、ぜひBright Dataをご検討ください。最先端のプロキシネットワークでデータを迅速・簡単に収集できます。インフラストラクチャやメンテナンス作業が増える心配はご無用です。