🥳Scrapeless コミュニティ に参加し、無料トライアルを請求して、強力な Web スクレイピング ツールキットにアクセスしてください。
ブログに戻る

PythonでSeleniumを使ってプロキシを使用する

James Thompson
James Thompson

Scraping and Proxy Management Expert

12-Sep-2024

Selenium を使ってウェブスクレイピングしているボットとして識別されましたか?

理解できます。Selenium は動的なウェブページをスクレイピングするための優れたツールですが、それだけでは、洗練されたボット対策には対処できません。Selenium スクレイパーにプロキシを追加することで、レート制限を制御したり、地理的な制限を回避したり、IP への禁止を回避したりすることができます。

Selenium プロキシ:それは何か?

プロキシは、クライアントとサーバーの間の仲介役を果たします。プロキシを使用することで、クライアントは地理的な制限を回避し、他のサーバーに匿名で安全なリクエストを送信できます。

プロキシサーバーは、HTTP クライアントと同様に、ヘッドレスブラウザで使用できます。ウェブサイトにアクセスすると、Selenium プロキシは IP アドレスの保護と、禁止の回避に役立ちます。

プロキシサポートを備えた Selenium は、サイトのスクレイピングやテストなどのブラウザ自動化タスクに非常に役立ちます。ウェブスクレイピングのために Selenium にプロキシを設定する方法については、読み進めてください。

Selenium プロキシの構成方法

次のコード行は、ヘッドレス Chrome ドライバーを読み込み、クライアントの IP アドレスを提供するウェブサイトである httpbin に移動します。スクリプトは最後に HTML 応答を出力します。

language Copy
# pip install selenium webdriver-manager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options

# ヘッドレスモードで実行するように Chrome オプションを設定
options = Options()
options.add_argument("--headless=new")

# Chrome ドライバーを初期化
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()), 
    options=options
)

# ターゲットウェブページに移動
driver.get("https://httpbin.io/ip")

# ターゲットウェブページの HTML を出力
print(driver.page_source)

# リソースを解放してブラウザを閉じる
driver.quit()

次の HTML がコードによって出力されます。

language Copy
<html><head><meta name="color-scheme" content="light dark"><meta charset="utf-8"></head><body><pre>{
  "origin": "50.217.226.40:80"
}
</pre><div class="json-formatter-container"></div></body></html>

Selenium では、プロキシを設定するには、次の手順を実行する必要があります。

  • 信頼性の高いプロキシサーバーを取得する
  • Chrome オプションの --proxy-server フィールドに入力する
  • 訪問するページに移動する

まず、Free Proxy List ウェブサイトにアクセスして、無料のプロキシアドレスを取得します。プロキシを使用するようにオプションを設定した Selenium を使用して Chrome を開きます。その後、目的のウェブページの本文テキストを出力します。

language Copy
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# プロキシアドレスとポートを定義
proxy = "20.235.159.154:80"

# プロキシを使用してヘッドレスモードで実行するように Chrome オプションを設定
options = Options()
options.add_argument("--headless=new")
options.add_argument(f"--proxy-server={proxy}")

# Chrome ドライバーを初期化
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    options=options
)

# ターゲットウェブページに移動
driver.get("https://httpbin.io/ip")

# ターゲットウェブページの本文コンテンツを出力
print(driver.find_element(By.TAG_NAME, "body").text)

# リソースを解放してブラウザを閉じる
driver.quit()

これで、Chrome の制御されたインスタンスによって行われたすべてのリクエストは、指定されたプロキシを経由してルーティングされます。

プロキシサーバーの IP とサイトの応答が一致しています。これは、Selenium がプロキシサーバーを使用してウェブサイトを見ていることを示しています。

Selenium でのプロキシ認証

一部のプロキシサーバーは、認証を使用して、有効な資格情報を持たないユーザーがサーバーにアクセスできないようにしています。これは、プレミアムプロキシや商用ソリューションを使用する場合によくあります。

認証されたプロキシ URL でユーザー名とパスワードを提供するための Selenium の構文を次に示します。

language Copy
<PROXY_PROTOCOL>://<YOUR_USERNAME>:<YOUR_PASSWORD>@<PROXY_IP_ADDRESS>:<PROXY_PORT>

ただし、Chrome ドライバーはデフォルトでユーザー名とパスワードを無視するため、--proxy-server に URL を入力しても機能しません。このような場合は、Selenium Wire などのサードパーティ製プラグインが役立ちます。

Selenium Wire を使用すると、ブラウザのリクエストを必要に応じて変更したり、リクエスト自体にアクセスしたりできます。インストールするには、次のコマンドを使用します。

language Copy
pip install blinker==1.7.0 selenium-wire

Selenium Wire を使用してプロキシ認証を処理する例を次に示します。

language Copy
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# プロキシを構成する
proxy_username = "<YOUR_USERNAME>"
proxy_password = "<YOUR_PASSWORD>"
proxy_address = "20.235.159.154"
proxy_port = "80"

# 認証を伴うプロキシ URL を作成する
proxy_url = f"http://{proxy_username}:{proxy_password}@{proxy_address}:{proxy_port}"

# ヘッドレスモードで実行するように Chrome オプションを設定
options = Options()
options.add_argument("--headless=new")

# Selenium Wire を使用して Chrome ドライバーを初期化
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    options=options
)

# プロキシを設定する
driver.seleniumwire_options.update({
    'proxy': {
        'http': proxy_url,
        'https': proxy_url
    }
})

# ターゲットウェブページに移動
driver.get("https://httpbin.io/ip")

# ターゲットウェブページの本文コンテンツを出力
print(driver.find_element(By.TAG_NAME, "body").text)

# リソースを解放してブラウザを閉じる
driver.quit()

このコードは、認証されたプロキシを使用して、指定されたウェブページのリクエストを送信する方法を示しています。Selenium Wire により、リクエストの処理にプロキシ資格情報を使用できます。

Selenium Wire を使用すると、プロキシ認証を処理し、Selenium プロキシの構成を拡張するための柔軟性を実現できます。これは、ウェブスクレイピング、ブラウザ自動化、または他のネットワーク関連タスクを実行するときに、特にプレミアムプロキシまたは商業用ソリューションを使用する場合に役立ちます。

python Copy
proxy_url = f"http://{proxy_username}:{proxy_password}@{proxy_address}:{proxy_port}"

# Selenium-Wire オプションを設定してプロキシを使用する
seleniumwire_options = {
    "proxy": {
        "http": proxy_url,
        "https": proxy_url
    },
}

# Chrome オプションを設定してヘッドレスモードで実行する
options = Options()
options.add_argument("--headless=new")

# サービス、Selenium-Wire オプション、Chrome オプションを使用して Chrome ドライバーを初期化する
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    seleniumwire_options=seleniumwire_options,
    options=options
)

# ターゲットのウェブページに移動する
driver.get("https://httpbin.io/ip")

# ターゲットのウェブページの本文の内容を出力する
print(driver.find_element(By.TAG_NAME, "body").text)

# リソースを解放してブラウザを閉じる
driver.quit()

継続的なウェブスクレイピングブロックにうんざりしていませんか?

Scrapeless: 利用可能な最高のオールインワンのオンラインスクレイピングソリューション!

当社のインテリジェントで高性能なプロキシローテーションを使用して、匿名性を維持し、IPベースの禁止を回避します。

無料でお試しください!

最高の Selenium プロキシ プロトコル

Selenium プロキシのプロトコルを選択するための最も一般的な選択肢は、HTTP、HTTPS、および SOCKS5 です。

HTTPS プロキシは、HTTP プロキシとは対照的に、インターネット経由で転送するデータを暗号化することで、セキュリティをさらに強化します。そのため、後者の方が好まれ、安全です。

SoCKS5 (または SOCKS) は、Selenium プロキシのもう 1 つの便利なプロトコルです。電子メールやファイル転送プロトコルなど、より多様なオンライン トラフィックを処理できるため、より柔軟なプロトコルです。

総合的に見て、Web スクレイピングとクロールは HTTP および HTTPS プロキシから大きなメリットを得られますが、非 HTTP トラフィックのタスクは SOCKS に適しています。

Selenium の Python でローテーション プロキシを使用する

スクリプトが短時間に複数のクエリを送信すると、サーバーはそれを疑わしいものとしてフラグ付けし、IP を禁止することができます。特定の IP アドレスを使用すると、Web サイトがそれらのアドレスからのリクエストを識別してブロックする可能性があるため、データのスクレイピングが成功する可能性が低くなります。

ただし、この問題は、ローテーション プロキシ戦略を採用することで解決できます。一定の時間またはリクエストの後、プロキシの変更により、エンド IP が継続的に変更されます。これにより、毎回異なるユーザーとして表示されるため、サーバーによって禁止されることがなくなります。

Selenium-wire を使用して Selenium でプロキシ ローテーターを作成する方法を見てみましょう。

最初にプロキシ プールを確立する必要があります。この例では、いくつかの無料のプロキシを使用します。

次のように、それらを配列に配置します。

language Copy
PROXIES = [
    "http://19.151.94.248:88",
    "http://149.169.197.151:80",
    # ...
    "http://212.76.118.242:97"
]

次に、random.choice() を使用してランダム プロキシを抽出し、これを使用してドライバーの新しいインスタンスを開始します。完成したコードは次のようになります。

language Copy
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

import random

# 回転させるプロキシのリスト
PROXIES = [
    "http://20.235.159.154:80",
    "http://149.169.197.151:80",
    # ...
    "http://212.76.118.242:97"
]

# ランダムにプロキシを選択する
proxy = random.choice(PROXIES)

# Selenium-Wire オプションを設定してプロキシを使用する
seleniumwire_options = {
    "proxy": {
        "http": proxy,
        "https": proxy
    },
}

# Chrome オプションを設定してヘッドレスモードで実行する
options = Options()
options.add_argument("--headless=new")

# サービス、Selenium-Wire オプション、Chrome オプションを使用して Chrome ドライバーを初期化する
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    seleniumwire_options=seleniumwire_options,
    options=options
)

# ターゲットのウェブページに移動する
driver.get("https://httpbin.io/ip")

# ターゲットのウェブページの本文の内容を出力する
print(driver.find_element(By.TAG_NAME, "body").text)

# リソースを解放してブラウザを閉じる
driver.quit()

実際には、無料のプロキシを使用すると、通常はブロックされます。基本を説明するために使用しましたが、実際のプロジェクトでは絶対にそれらに依存しないでください。

Selenium Grid のエラー 403: プロキシは禁止されています

クロスプラットフォーム スクリプトの並列実行とリモート ブラウザー コントロールは、Selenium Grid を使用することで可能になります。ただし、これを使用すると、Web スクレイピング中に最も頻繁に発生する問題の 1 つであるエラー 403: プロキシは禁止されています が発生する可能性があります。この問題が発生する理由は 2 つあります。

  • ポート 4444 が別のプロセスで既に使用されています。
  • RemoteWebDriver 要求で正しい URL が受信されていません。
    問題が解決しない場合は、以下に示すように、リモート ドライバーが正しいハブ URL に接続されていることを確認してください。
language Copy
import selenium.webdriver as webdriver
# ...
webdriver.Remote('http://localhost:4444/wd/hub', {})

まとめ

プロキシサーバーは、ボット検出システムを回避するのに役立ちますが、多くの手入れが必要で、常に信頼できるわけではありません。ScrapelessのようなウェブスクレイピングAPIを使用すると、あらゆるボット対策を確実に回避でき、プロキシの検索と設定の手間を省けます。Scrapelessの無料トライアルを手に入れましょう!

Scrapeless では、適用される法律、規制、および Web サイトのプライバシー ポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツはデモンストレーションのみを目的としており、違法または侵害的な活動には関与していません。 私たちは、このブログまたはサードパーティのリンクからの情報の使用についていかなる保証もせず、一切の責任を負いません。 スクレイピング活動を行う前に、法律顧問に相談し、対象となる Web サイトの利用規約を確認するか、必要な許可を取得してください。

最も人気のある記事

カタログ