HTTPXでプロキシを使用する方法

HTTPXのプロキシ設定を、認証なし、認証あり、ローテーション、フォールバックプロキシの例とともに学びます。
3 分読
How To Use Proxies With HTTPX blog image

今日は、HTTPXでプロキシを使用する方法を学びます。プロキシは、スクレイパーとスクレイピング対象のサイトの間に位置します。スクレイパーは対象サイトへのリクエストをプロキシサーバーに送信します。そしてプロキシが対象サイトを取得し、スクレイパーに返します。

認証なしプロキシの使用方法

まとめると、すべてのリクエストはproxy_urlに送られます。以下は認証なしプロキシを使用する例です。つまり、ユーザー名やパスワードを使用していません。この例は彼らのドキュメントからヒントを得ています。

import httpx

proxy_url = "http://localhost:8030"


with httpx.Client(proxy=proxy_url) as client:
    ip_info = client.get("https://geo.brdtest.com/mygeo.json")
    print(ip_info.text)

認証付きプロキシの使用方法

プロキシがユーザー名とパスワードを必要とする場合、それは「認証付き」プロキシと呼ばれます。これらの認証情報は、アカウントを認証し、プロキシへの接続を提供するために使用されます。

認証ありの場合、proxy_urlは次のようになります:http://<username>:<password>@<proxy_url>:<port_number>。以下の例では、zoneとusernameの両方を使用して認証文字列のユーザー部分を作成します。

ベース接続にはデータセンター・プロキシを使用しています。

import httpx

username = "your-username"
zone = "your-zone-name"
password = "your-password"

proxy_url = f"http://brd-customer-{username}-zone-{zone}:{password}@brd.superproxy.io:33335"

ip_info = httpx.get("https://geo.brdtest.com/mygeo.json", proxy=proxy_url)

print(ip_info.text)

上記のコードは非常にシンプルです。これは、設定したいあらゆる種類のプロキシの基本となります。

  • まず、設定変数を作成します:username、zone、password。
  • これらを使用してproxy_urlを作成します:f"http://brd-customer-{username}-zone-{zone}:{password}@brd.superproxy.io:33335"。
  • プロキシ接続に関する一般情報を取得するため、APIにリクエストを送信します。

レスポンスは以下のようになるはずです。

{"country":"US","asn":{"asnum":20473,"org_name":"AS-VULTR"},"geo":{"city":"","region":"","region_name":"","postal_code":"","latitude":37.751,"longitude":-97.822,"tz":"America/Chicago"}}

ローテーションプロキシの使用方法

ローテーションプロキシを使用する場合、プロキシのリストを作成し、その中からランダムに選択します。以下のコードでは、countriesのリストを作成します。リクエストを送信する際、random.choice()を使用してリストからランダムな国を使用します。proxy_urlはその国に合わせてフォーマットされます。

以下の例では、ローテーションプロキシの小さなリストを作成します。

import httpx
import asyncio
import random


countries = ["us", "gb", "au", "ca"]
username = "your-username"
proxy_url = "brd.superproxy.io:33335"

datacenter_zone = "your-zone"
datacenter_pass = "your-password"


for random_proxy in countries:
    print("----------connection info-------------")
    datacenter_proxy = f"http://brd-customer-{username}-zone-{datacenter_zone}-country-{random.choice(countries)}:{datacenter_pass}@{proxy_url}"

    ip_info = httpx.get("https://geo.brdtest.com/mygeo.json", proxy=datacenter_proxy)

    print(ip_info.text)

この例は、実は最初の例とそれほど変わりません。以下が主な違いです。

  • 国の配列を作成します:["us", "gb", "au", "ca"]。
  • 単一のリクエストを送信する代わりに、複数のリクエストを送信します。新しいリクエストを作成するたびに、random.choice(countries)を使用してproxy_urlを作成するたびにランダムな国を選択します。

フォールバックプロキシ接続の作成方法

上記の例では、データセンターと無料プロキシのみを使用してきました。無料プロキシはあまり信頼性がありません。データセンター・プロキシは、より困難なサイトではブロックされがちです。

この例では、safe_get()という関数を作成します。この関数を呼び出すと、最初にデータセンター接続を使用してURLの取得を試みます。これが失敗すると、レジデンシャル接続にフォールバックします。

import httpx
from bs4 import BeautifulSoup
import asyncio


country = "us"
username = "your-username"
proxy_url = "brd.superproxy.io:33335"

datacenter_zone = "datacenter_proxy1"
datacenter_pass = "datacenter-password"

residential_zone = "residential_proxy1"
residential_pass = "residential-password"

cert_path = "/home/path/to/brightdata_proxy_ca/New SSL certifcate - MUST BE USED WITH PORT 33335/BrightData SSL certificate (port 33335).crt"


datacenter_proxy = f"http://brd-customer-{username}-zone-{datacenter_zone}-country-{country}:{datacenter_pass}@{proxy_url}"

residential_proxy = f"http://brd-customer-{username}-zone-{residential_zone}-country-{country}:{residential_pass}@{proxy_url}"

async def safe_get(url: str):
    async with httpx.AsyncClient(proxy=datacenter_proxy) as client:
        print("trying with datacenter")
        response = await client.get(url)
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, "html.parser")
            if not soup.select_one("form[action='/errors/validateCaptcha']"):
                print("response successful")
                return response
    print("response failed")
    async with httpx.AsyncClient(proxy=residential_proxy, verify=cert_path) as client:
        print("trying with residential")
        response = await client.get(url)
        print("response successful")
        return response

async def main():
    url = "https://www.amazon.com"
    response = await safe_get(url)
    with open("out.html", "w") as file:
        file.write(response.text)

asyncio.run(main())

この例は、この記事で扱ってきた他の例よりも少し複雑です。

  • 今回は2組の設定変数があります。1つはデータセンター接続用、もう1つはレジデンシャル接続用です。
  • 今回は、HTTPXのより高度な機能を紹介するためにAsyncClient()セッションを使用します。
  • まず、datacenter_proxyを使用してリクエストを試みます。
  • 適切なレスポンスが得られない場合は、residential_proxyを使用してリクエストを再試行します。また、コード内のverifyフラグにも注意してください。レジデンシャルプロキシを使用する場合、当社のSSL証明書をダウンロードして使用する必要があります。
  • 適切なレスポンスを取得したら、そのページをHTMLファイルに書き込みます。このページをブラウザで開くことで、プロキシが実際にアクセスし、私たちに返した内容を確認できます。

上記のコードを試すと、出力と結果のHTMLファイルは次のようになるはずです。

trying with datacenter
response failed
trying with residential
response successful
Screenshot of the Amazon homepage

Bright Dataの製品がどのように役立つか

この記事を通じてお気づきかもしれませんが、当社のデータセンター・プロキシは非常に手頃な価格であり、レジデンシャルプロキシはデータセンター・プロキシが機能しない場合の優れたフォールバックを提供します。また、データ収集のニーズを支援するさまざまな他のツールも提供しています。

  • Web Unlocker:最も困難なアンチボットでも突破できます。Web Unlockerはページ上のあらゆるCAPTCHAを自動的に認識し解決します。アンチボットを突破すると、ウェブページを返してくれます。
  • スクレイピングブラウザ:この製品にはさらに多くの機能があります。スクレイピングブラウザは、プロキシ統合と自動CAPTCHA解決ツールを備えたリモートブラウザを実際に制御できます。
  • Web Scraper API:これらのAPIを使用すると、スクレイピングは私たちが代わりに行います。必要なのはAPIを呼び出して、レスポンスで受け取ったJSONデータをパースすることだけです。
  • データセット:当社のデータセットマーケットプレイスを探索して、何百もの事前収集済みデータセットを見つけるか、カスタムデータセットをリクエスト・構築してください。更新頻度を選択し、必要なデータポイントのみをフィルタリングできます。

結論

HTTPXと当社のプロキシを組み合わせることで、プライベートで効率的、かつ信頼性の高いウェブスクレイピング方法が得られます。プロキシをローテーションしたい場合は、Pythonの組み込みrandomライブラリを使用するだけで簡単に実現できます。データセンター・プロキシとレジデンシャルプロキシを組み合わせることで、ほとんどのブロックシステムを突破する冗長な接続を構築できます。

ご覧いただいたとおり、Bright Dataはウェブスクレイピングプロジェクトに必要なすべてを提供します。今すぐBright Dataのプロキシを使い始めましょう!