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>。以下の例では、 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 のプロキシで無料トライアルを始めましょう!

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

あなたは下記にもご興味がおありかもしれません

web scraping with claude blog image
ウェブデータ

2025年のクロードによるウェブスクレイピング

Pythonを使ってWebスクレイピングを自動化し、構造化データを楽に抽出するClaude AIの使い方を学ぶ。
18 分読
Building AI-Ready Vector Datasets for LLMs blog image
AI

LLMのためのAI対応ベクトルデータセット構築:Bright Data、Google Gemini、Pineconeを使ったガイド

大規模言語モデル(LLM)は、私たちが情報にアクセスし、インテリジェントなアプリケーションを構築する方法を変革しています。LLMの可能性を最大限に引き出すには、特にドメイン固有の知識や独自のデータを使用する場合、高品質で構造化されたベクトルデータセットを作成することが重要です。LLMの性能と精度は、入力データの品質に直接結びついています。準備不足のデータセットは劣悪な結果をもたらす可能性があり、一方、十分にキュレーションされたデータセットはLLMを真のドメイン・エキスパートに変えることができます。 このガイドでは、AIに対応したベクターデータセットを生成するための自動パイプラインの構築方法を順を追って説明する。 課題:LLMのためのデータ収集と準備 LLMは膨大な汎用テキストコーパスで学習されますが、商品関連のクエリへの回答、業界ニュースの分析、顧客フィードバックの解釈など、特定のタスクやドメインに適用すると、不足することがよくあります。LLMを真に役立てるには、ユースケースに合わせた高品質のデータが必要です。 このデータは通常、ウェブ上に分散していたり、複雑なサイト構造の背後に隠されていたり、ボット対策によって保護されていたりする。 当社の自動ワークフローは、データセット作成の最も困難な部分を処理する合理化されたパイプラインでこれを解決します: コア技術の概要 パイプラインを構築する前に、関連するコアテクノロジーと、それぞれがワークフローをどのようにサポートしているかを簡単に見ておこう。 ブライトデータスケーラブルなウェブデータ収集 AIに対応したベクターデータセットを作成するための最初のステップは、関連性のある高品質なソースデータを収集することです。ナレッジベースやドキュメンテーションのような内部システムから得られるものもあるが、大部分は公共のウェブから得られることが多い。 しかし、最近のウェブサイトは、CAPTCHA、IPレート制限、ブラウザフィンガープリントなどの高度なボット対策メカニズムを使用しているため、大規模なスクレイピングは困難である。 Bright Dataは、データ収集の複雑さを抽象化するWeb Unlocker APIでこの課題を解決します。プロキシのローテーション、CAPTCHAの解決、ブラウザのエミュレーションを自動的に処理するため、データへのアクセス方法ではなく、データに集中することができます。 Google Gemini: インテリジェント・コンテンツ・トランスフォーメーション Geminiは、Googleによって開発された強力なマルチモーダルAIモデルのファミリーであり、様々なタイプのコンテンツを理解し処理することに優れている。私たちのデータ抽出パイプラインにおいて、Geminiは3つの重要な機能を果たします: このAIを活用したアプローチは、特に以下のような使用例において、脆弱なCSSセレクタや壊れやすい正規表現に依存する従来の方法よりも大きな利点をもたらす: AIがデータ抽出プロセスにどのような変化をもたらしているかについては、Using AI for Web Scrapingをご覧ください。スクレイピングのワークフローにGeminiを実装するための実践的なチュートリアルをお探しの場合は、包括的なガイドをご覧ください:GeminiによるWebスクレイピングをご覧ください。 文の変形意味埋め込み文の生成 エンベッディングは、高次元空間におけるテキスト(または他のデータタイプ)の密なベクトル表現である。これらのベクトルは意味的な意味を捉え、コサイン類似度やユークリッド距離のようなメトリクスを用いて測定される、類似したテキスト片を近接したベクトルで表現することを可能にする。この特性は、セマンティック検索、クラスタリング、検索拡張生成(RAG)のようなアプリケーションで重要である。 Sentence Transformersライブラリは、高品質の文や段落の埋め込みを生成するための使いやすいインターフェースを提供する。Hugging Face Transformersの上に構築され、意味タスクのために微調整された幅広い事前学習済みモデルをサポートしています。 このエコシステムで最も人気があり、効果的なモデルの1つがオールMiniLM-L6-v2である: より大きなモデルはより微妙なエンベディングを提供するかもしれないが、all-MiniLM-L6-v2は性能、効率、コストの間で非常に優れたバランスを提供する。その384次元ベクトルは ほとんどの実用的なユースケース、特に初期段階の開発やリソースに制約のある環境では、このモデルで十分すぎる。エッジケースにおける精度のわずかな低下は、通常、スピードとスケーラビリティの大幅な向上によって相殺されます。そのため、AIアプリケーションの最初のイテレーションを構築する場合や、控えめなインフラストラクチャでパフォーマンスを最適化する場合は、all-MiniLM-L6-v2を使用することをお勧めします。 Pineconeベクトル埋め込み画像の保存と検索 テキストがベクトル埋め込みデータに変換されると、それを効率的に保存、管理、照会するための専用のデータベースが必要になります。従来のデータベースはこのために設計されていません。ベクトル・データベースは、埋め込みデータの高次元の性質を扱うために特別に設計されており、RAGパイプライン、セマンティック検索、パーソナライゼーション、その他のAI駆動型アプリケーションに不可欠なリアルタイムの類似性検索を可能にします。 Pineconeは、開発者フレンドリーなインターフェイス、低レイテンシの検索パフォーマンス、完全に管理されたインフラストラクチャで知られる人気のベクトルデータベースです。ベクトル検索インフラストラクチャの複雑さを抽象化することで、複雑なベクトルインデックスと検索を効率的に管理します。主なコンポーネントは以下の通りです: Pineconeは2つのデプロイメントアーキテクチャを提供する:ServerlessとPod-Based です。ほとんどのユースケース、特に開始時や動的な負荷に対処する場合は、シンプルさとコスト効率からサーバーレスが推奨されます。 セットアップと前提条件 パイプラインを構築する前に、以下のコンポーネントが適切に設定されていることを確認する。 前提条件 各APIキーの生成方法については、以下のツール固有の設定セクションを参照してください。 必要なライブラリのインストール このプロジェクトのコアとなるPythonライブラリをインストールする: これらのライブラリーは提供している: 環境変数の設定 プロジェクトのルート・ディレクトリに.envファイルを作成し、APIキーを追加する: ブライトデータ設定 Bright DataのWeb Unlockerを使用するには: 実装例と統合コードについては、Web Unlocker GitHub […]
6 分読
AI

LLMにおけるスーパーバイズド・ファインチューニングとは?

このPythonガイドでは、概念、ツール、ワークフロー、そしてAIプロジェクトを向上させる実践的な例を取り上げています。
7 分読