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

認証なし、認証あり、ローテーション、フォールバックプロキシの例を使って、HTTPX でのプロキシの設定を解説します。
3 min read
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>。以下の例では、 zoneusername の両方を使用して、認証文字列のユーザーの部分を作成します。

ベースとなる接続にはデータセンタープロキシを使用します。

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)

上のコードはとてもシンプルです。これは、あらゆる種類のプロキシの設定の基礎になります。

  • まず、構成変数 usernamezonepassword を作成します。
  • これらを使って、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"] を作成します。
  • 単一のリクエストを行う代わりに、複数のリクエストを行います。毎回新しいリクエストを作成する際に、proxy_url を作成するたびに random.choice(countries) を使用して国をランダムに選択します。

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

上の例では、データセンターと無料プロキシのみを使用しました。無料プロキシはあまり信頼性が高くありません。データセンタープロキシは、より難しいサイトでブロックされる傾向があります。

この例では、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 セット使用されます。
  • 今回は AsyncClient() セッションを使用して、HTTPX のより高度な機能をいくつか紹介します。
  • まず、datacenter_proxy を使用してリクエストを試みます。
  • 適切な応答が得られない場合は、residential_proxy を使用してリクエストを再試行します。また、コード内の verify フラグにも注目してください。当社の住宅用プロキシを使用する場合は、SSL 証明書をダウンロードして使用する必要があります。
  • 有効な応答が得られたら、ページを HTML ファイルに書き込みます。このページをブラウザで開いて、プロキシが実際にアクセスして送り返した内容を確認できます。

上のコードを試してみると、出力と生成される HTML ファイルは、次のようなものになります。

trying with datacenter
response failed
trying with residential
response successful
Amazon ホームページのスクリーンショット

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

この記事を読むうちにお気づきかもしれませんが、当社のデータセンタープロキシは非常に手頃に利用でき、住宅用プロキシはデータセンタープロキシが機能しない場合の優れた代替手段となります。また、当社は他にもデータ収集のニーズに役立つさまざまなツールを提供しています。

  • Web Unlocker: 最も難しいボット対策でもくぐり抜けます。Web Unlocker は、ページ上のあらゆる CAPTCHA を自動的に認識して解決します。ボット対策を通過した後、ウェブページが送り返されます。
  • Scraping Browser: この製品にはさらに多くの機能があります。Scraping Browser を使うと、プロキシ統合自動 CAPTCHA 解決ツールにより、実際にリモートブラウザを制御できます。
  • Web Scraper API: これらの API をご利用いただけば、当社がスクレイピングを代行します。お客様は API を呼び出して、応答で受け取った JSON データを解析するだけです。
  • データセット: データセットマーケットプレイスで事前に収集済みの何百ものデータセットを閲覧したり、カスタムデータセットをリクエストしたり構築したりできます。更新頻度が選べ、必要なデータポイントのみに絞れます。

まとめ

HTTPX と当社のプロキシを組み合わせると、匿名で効率的かつ信頼性の高い方法でウェブスクレイピングが行えます。プロキシをローテーションするには、Python の組み込みの random ライブラリを使用するだけです。データセンタープロキシと住宅用プロキシを組み合わせることで、ほとんどのブロッキングシステムを通り抜けられる冗長接続を構築できます。

ご説明したとおり、Bright Data はウェブスクレイピングプロジェクト用のフルパッケージを提供しています。今すぐ Bright Data のプロキシで無料トライアルを始めましょう!

クレジットカードは必要ありません