インターネットを使って情報をやり取りするには、必ず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をインストールします。
完了したら、次のコマンドを実行してサービスを開始します。
次のコマンドを使用してサービスのステータスを確認してください。
出力は次のようになります。
これは、サービスが有効で実行中であることを示します。デフォルトでは、Squidはポート3128で実行され、リクエストを受け取ります。次のcurlコマンドを使用して、プロキシサーバー経由の通信をテストしてください。
次のような応答が返ってくればOKです。
メタデータにはパブリックIPアドレス、および所有者の国と組織が含まれているので、正常に動作するプロキシサーバーがインストールされていることも確認できました。
デモ用スクレイパーをセットアップする
わかりやすくするために、このGitHubリポジトリにあるシンプルなGo Webスクレイパーアプリケーションを使います。このスクレイパーは、オープンソースソフトウェア製品について話し合う人気ブログIt’s FOSSの最新の投稿のタイトル、抜粋、カテゴリを取り込みます。次に、スクレイパーはLumtestにアクセスして、スクレイパーのHTTPクライアントがWebとのやり取りに使用するIPアドレスに関する情報を取得します。Colly、goquery、Seleniumという異なる3つのGoパッケージで同じロジックが実装されます。次のセクションでは、プロキシサーバーを使用するように各実装を変更する方法について説明します。
最初に、お気に入りの端末/シェルで次のコマンドを実行して、リポジトリを複製します。
このリポジトリは、完成したコードを含むメイン
ブランチと、変更対象の初期コードを含むbasic
ブランチの2つのブランチで構成されています。次のコマンドを使って、basic
ブランチにチェックアウト
します。
このブランチでは、プロキシが設定されていないスクレイパーのライブラリ実装ごとに3つの.go
ファイルが含まれています。実行ファイルchromedriver
も含まれていますが、これはスクレイパーのSelenium実装に必要です。
特定のファイル名でgo run
コマンドを使用すると、どの実装も個別に実行できます。たとえば、次のコマンドはCollyでスクレイパーを実行します。
出力は次のようになります。
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クライアント定義を貼り付けて、次のスニペットに置き換えます。
このスニペットは、ローカルプロキシサーバーを使用するように設定されたトランスポートでHTTPクライアントを変更します。IPアドレスは必ずプロキシサーバーのIPアドレスに置き換えてください。
次に、プロジェクトディレクトリから次のコマンドを使用してこの実装を実行します。
出力は次のようになります。
Collyでローカルプロキシを使う
CollyはGo用の多用途で効率的なWebスクレイピングフレームワークで、使いやすいAPIや、goquery
などのHTML解析ライブラリとシームレスに統合できることが特長です。goquery
とは異なり、高速スクレイピング、ローカルキャッシュ、レート制限の非同期リクエストなど、ネットワーク関連のさまざまな動作を処理するためのAPIをサポートおよび提供します。これによって、Webリソースの効率的かつ責任ある使用、Cookieとセッションの自動処理、カスタマイズ可能なユーザーエージェント、包括的なエラー処理が保証されます。プロキシの切り替えやローテーションを行いながらプロキシを使用することもできます。ヘッドレスブラウザーと統合すれば、JavaScriptで生成されたコンテンツのスクレイピングなどのタスクにも拡張できます。
colly.go
ファイルをエディタかIDEで開き、ScrapeWithColly()
関数内で新しいコレクタを初期化した直後に、次のコードを貼り付けてください。
このスニペットはCollyのsetProxy()
メソッドを使用して、このコレクタインスタンスでネットワークリクエストに使用されるプロキシサーバーを定義します。
次に、プロジェクトディレクトリから次のコマンドを使用してこの実装を実行します。
出力は次のようになります。
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{}
定義を次のスニペットに置き換えます。
このスニペットは、Seleniumのさまざまなプロキシパラメーターを定義しており、これがWebDriver用のSeleniumの機能の設定に使用されます。 次回の実行では、このプロキシ接続が使用されます。
次に、プロジェクトディレクトリから次のコマンドを使用して実装を実行します。
出力は次のようになります。
プロキシサーバーは自分でメンテナンスできるとはいえ、多くの地域向けの新しいサーバーのセットアップ、その他のメンテナンス作業、セキュリティの問題など、さまざまな要因による制限があります。
Bright Dataプロキシサーバー
プロキシサーバーとサービスの包括的なセットを備えた、受賞歴のあるBright Dataグローバルプロキシネットワークインフラストラクチャを、さまざまなWebデータ収集用途にぜひご利用ください。
Bright Dataプロキシサーバーの広範なグローバルネットワークを利用すれば、国境を越えたさまざまな場所から簡単にアクセスしてデータを収集できます。Bright Dataは、3億5,000万を超える他に類を見ない住宅用、ISP用、データセンター用、モバイル用プロキシをはじめとして、多様なタイプのプロキシを提供しています。これらにはそれぞれ、合法性、速度、信頼性などの固有の利点があり、Webデータ収集タスクの特性に合わせてお選びいただけます。
加えて、Bright Dataプロキシローテーションシステムは高い匿名性を保証し、検出される可能性を最小限にできるため、継続的かつ大規模なWebデータ収集に最適です。
Bright Dataの住宅用プロキシを設定する
Bright Dataの住宅用プロキシは簡単に取得できます。無料トライアルにサインアップしてぜひお試しください。サインアップすると、次のような画面になります。
住宅用プロキシの開始ボタンをクリックしてください。
以下のフォームに入力するよう求められます。
このインスタンスの名前を指定します。ここでは、my_go_demo_proxy
にしましょう。プロビジョニングするIPタイプを指定する必要があります。共有を選択してください (共有プロキシを使用する場合)。次に、Webコンテンツのアクセス時に位置情報を変更するレベルを指定します。デフォルトでは、これは国レベルまたはゾーンです。リクエストしたWebページをキャッシュするかどうかを指定する必要もあります。今は、キャッシュを無効にしましょう。
この情報を入力したら、追加をクリックします。住宅用プロキシの作成とプロビジョニングが行われます。
次に、住宅用プロキシを有効にする必要があります。新規ユーザーの場合は、まず請求先情報の入力を求められます。この手順が完了したらダッシュボードに移動し、作成した住宅用プロキシをクリックします。
アクセスパラメータータブが選択されていることを確認します。
ここに、ホスト、ポート、認証情報など、住宅用プロキシの利用に必要なさまざまなパラメーターが表示されます。この情報はすぐに必要になります。
ここからいよいよ、スクレイパーの3つの実装にBright Data住宅用プロキシを統合していきます。ローカルサーバーの場合と作業が似ていますが、認証が含まれる点が異なります。また、プログラムでWebとやり取りするので、グラフィカルユーザーインターフェイスを備えたブラウザーでの操作とは異なり、プロキシサーバーからのSSL証明書を確認して受け入れることができない可能性があります。そのため、Webクライアント側のプログラムでSSL証明書の検証を無効にして、リクエストが中断されないようにする必要があります。
まず、プロジェクトディレクトリにbrightdata
というディレクトリを作成し、3つの.go
ファイルをbrightdata
ディレクトリにコピーします。次のようなディレクトリ構造になります。
これから変更するのは、brightdata
ディレクトリ内のファイルです。
goqueryでBright Data住宅用プロキシを使う
ScrapeWithGoQuery()
関数内でProxyStr
変数を変更し、認証資格情報をプロキシのURLに含める必要があります。形式は、http://USERNAME:PASSWORD@HOST:PORT
です。現在の定義を次のスニペットに置き換えてください。
次に、HTTPクライアントのトランスポートを変更して、プロキシサーバーのSSL/TLS証明書の検証を無視する設定にする必要があります。まず、crypto/tls
パッケージをインポートに追加します。次に、プロキシのURLを解析し、http.Transport
定義を次のスニペットに置き換えます。
このスニペットは、ローカルプロキシサーバーを使用するように設定されたトランスポートでHTTPクライアントを変更します。IPアドレスは必ずプロキシサーバーのIPアドレスに置き換えてください。
次に、プロジェクトディレクトリから次のコマンドを使用してこの実装を実行します。
出力は次のようになります。
同じ記事をスクレイピングしているのに、異なる結果がプロキシIPチェックから返されたことがわかるでしょう。別の場所または国からアクセスされたからです。
CollyでBright Data住宅用プロキシを使う
CollyにはSSL/TLS検証をプログラムで無効にするメソッドがありませんが、ユーザー固有のトランスポート
を提供して、それがHTTPクライアントで使用されるようにする方法はあります。
colly.go
ファイルをエディタかIDEで開き、ScrapeWithColly()
関数内で新しいコレクタを初期化した後に、次のコードを貼り付けてください (net/url
とnet/http
のインポートを追加することを忘れないでください)。
このスニペットでは、SSL検証を無効化したHTTPトランスポートを定義し、Colly withTransport()
メソッドを使用して、ネットワークリクエストを行うコレクタのトランスポートを設定しています。
ProxyStr
変数を変更し、住宅用プロキシの認証情報を格納します (goqueryで行ったのと同様)。ProxyStr
行を次のスニペットに置き換えてください。
文字列値を、住宅用プロキシのアクセスパラメーターページにある値に置き換えることを忘れないでください。
次に、プロジェクトディレクトリから次のコマンドを使用してこの実装を実行します。
出力の「Check Proxy IP」を見ると、同じ認証情報が使用されているのに国が違うことがわかるでしょう。
SeleniumでBright Data住宅用プロキシを使う
Seleniumで使用する場合は、認証情報を含むプロキシURL文字列を使用するようにSelenium.Proxy{}
定義を変更する必要があります。現在のプロキシ定義を次の内容に置き換えてください。
net/url
パッケージのインポートを忘れないでください。
さまざまなプロキシパラメーターが定義されたこのスニペットがマージされて、プロキシ設定で使用されるプロキシURLが作成されます。
住宅用プロキシはこれまでに説明した実装と同様に設定されましたが、ここでは、SSL検証を無効にするオプションをChrome WebDriverに設定する必要があります。そのためにChromeCaps
定義の引数を変更して、次のように--ignore-certificate-errors
オプションを追加します。
Seleniumは、デフォルトでは認証されたプロキシ構成をサポートしませんが、認証されたプロキシ接続用のChrome拡張機能をビルドする小さなパッケージを使用して、この問題を回避できます。
まず、このgo get
コマンドを使用して、そのパッケージをプロジェクトに追加します。
次に、パッケージをbrightdata/selenium.go
ファイルにインポートします。ファイル先頭のインポートブロックにgithub.com/rexfordnyrk/proxyauth
行を追加してください。
次に、proxyauthパッケージのBuildExtension()
メソッドでChrome拡張機能をビルドして、Bright Data住宅用プロキシの認証情報と一緒に渡す必要があります。そのために、chromeCaps
定義の後、caps.AddChrome(chromeCaps)
行の前に、次のコードスニペットを貼り付けてください。
このスニペットでChrome拡張機能が作成され、Chrome WebDriverに追加されます。これにより、提供されたプロキシ認証情報を介して、認証されたWebリクエストが有効になります。
プロジェクトディレクトリから次のコマンドを使用してこの実装を実行します。
出力は次のようになります。
ここでも、出力の最後にあるIP情報を見てください。リクエストの送信に別の国が使用されていることがわかるでしょう。これは、Bright Dataプロキシローテーションシステムが動作している様子です。
ここまで見てきたとおり、Bright DataはGoアプリケーションで簡単に利用できます。最初に、Bright Dataプラットフォームで住宅用プロキシを作成し、認証情報を取得します。次に、その情報を使用して、Webでプロキシを使用するようにコードを変更します。
まとめ
Webプロキシサーバーは、インターネットでのやり取りをカスタマイズするための非常に重要なコンポーネントです。この記事では、プロキシサーバーについて、およびSquidを使用したセルフホストのプロキシサーバーをセットアップする方法について、その全体を学びました。ローカルプロキシサーバーをGoアプリケーション (今回はWebスクレイパー) に統合する方法についても説明しました。
プロキシサーバーの利用にご関心がおありでしたら、ぜひBright Dataをご検討ください。最先端のプロキシネットワークでデータを迅速・簡単に収集できます。インフラストラクチャやメンテナンス作業が増える心配はご無用です。