DrissionPageは、Pythonスクレイパーが長年抱えてきたジレンマを解決するフレームワークです。「シンプルなHTTPリクエストで十分なページ」なのか「JavaScriptレンダリングが必要なページ」なのか——この判断のために requests と Selenium/Playwright を行き来する必要がなくなります。本記事では、DrissionPageの設計モデル、プロキシ統合、そしてProxyHatレジデンシャルプロキシを使った実践的なスクレイピングパターンを解説します。
法的注意事項:公開データの収集のみを想定しています。米国CFAA(Computer Fraud and Abuse Act)やEUのGDPRなど、対象サイトの利用規約と適用法令を遵守してください。robots.txtの尊重とレート制限の遵守は必須です。公式APIが利用可能な場合は、そちらを優先してください。
DrissionPageの設計モデルとDrissionPage proxyの必要性
DrissionPageは3つのページクラスを提供します。それぞれの役割を理解することが、プロキシ戦略の基盤になります。
SessionPage — HTTPモード
requestsライクなHTTP通信を行うクラスです。ブラウザを起動しないため、メモリ消費は約50MB程度、1リクエストあたりのレイテンシは200ms未満で済みます。静的HTMLやJSON APIの取得に適しています。Cookieやヘッダーは自動管理されます。
ChromiumPage — ブラウザモード
Chrome DevTools Protocol(CDP)を直接操作し、Chromiumブラウザを制御します。SeleniumのようなWebDriverを経由しないため、オーバーヘッドが少ないのが特徴です。JSレンダリング、SPAの操作、XHRのキャプチャに対応します。ただしブラウザプロセスの起動には1〜3秒かかり、メモリは200〜500MB消費します。
WebPage — ハイブリッドモード
WebPageはSessionPageとChromiumPageを統合し、同一オブジェクト内でモードを切り替えられます。重要なのは、Cookieやセッション状態を共有したまま切り替えられる点です。HTTPモードでログインし、その状態を維持したままブラウザモードに切り替えてJSレンダリング済みページを取得——こういう使い方が可能です。
この設計により、常にブラウザを起動するSelenium/Playwrightと比較して、リソース消費を大幅に削減できます。HTTPで十分なページにブラウザを使わないことで、クラウド実行コストを50%以上削減できるケースもあります。
詳細はDrissionPage公式ドキュメントを参照してください。CDPの仕様についてはChrome DevTools Protocol仕様が权威ある参照先です。
DrissionPage web scrapingのidiomatic API
DrissionPageのAPIは、Seleniumとは異なる独自のロケーター構文を採用しています。これを理解することが効率的なスクレイピングの鍵です。
ele() / eles() ロケーター
要素の取得には ele()(単一要素)と eles()(複数要素)を使います。ロケーター構文は以下の通りです:
'tag:input'— タグ名で検索'@class=submit-btn'— 属性で検索'@text()=ログイン'— テキスト内容で検索'xpath://div[@id="content"]'— XPath構文'c:.article-title'— CSSセレクター
from DrissionPage import WebPage
page = WebPage()
page.get('https://example.com')
# 単一要素
title = page.ele('tag:h1').text
# 複数要素
links = page.eles('tag:a')
for link in links:
print(link.attr('href'))
# 属性ベースの検索
btn = page.ele('@class=btn-primary@text()=送信')
ChromiumOptionsによるブラウザ設定
ブラウザの起動オプションは ChromiumOptions で制御します。ヘッドレスモード、ユーザーエージェント、プロキシ、ウィンドウサイズなどを設定できます。
from DrissionPage import ChromiumOptions
co = ChromiumOptions()
co.headless(True)
co.set_argument('--no-sandbox')
co.set_argument('--disable-gpu')
co.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...')
co.set_proxy('http://gate.proxyhat.com:8080')
listen.start() によるバックグラウンドXHRキャプチャ
DrissionPageの強力な機能の1つが、listen APIによるネットワークパケットのキャプチャです。SPAがバックグラウンドで呼び出すXHRやFetchリクエストを傍受し、JSONレスポンスを直接取得できます。
page = ChromiumPage()
page.listen.start('api/products') # URLパターンを指定
page.get('https://example.com/products')
packet = page.listen.wait()
print(packet.response.body) # JSONデータを直接取得
この機能により、レンダリング済みHTMLをパースする代わりに、構造化されたJSON APIレスポンスを直接取得できるケースが多くあります。これにより、後述する「ブラウザを使うべきでないケース」の判断材料にもなります。
DrissionPage proxy設定の実装
プロキシの設定方法は、使用するページクラスによって異なります。
SessionPageのプロキシ設定
SessionPageでは set_proxies() メソッドを使用します。requestsと同様に、プロキシURLを渡すだけです。
from DrissionPage import SessionPage
page = SessionPage()
page.set.proxies('http://user-country-US:pass@gate.proxyhat.com:8080')
page.get('https://httpbin.org/ip')
print(page.json['origin'])
ChromiumPageのプロキシ設定
ChromiumPageでは ChromiumOptions.set_proxy() を使います。これはブラウザ起動前に設定する必要があります。
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.set_proxy('http://user-country-US:pass@gate.proxyhat.com:8080')
co.headless(True)
page = ChromiumPage(co)
page.get('https://httpbin.org/ip')
print(page.ele('tag:pre').text)
なぜレジデンシャルプロキシが必要なのか
データセンタープロキシは高速ですが、IPレピュテーションが低く、多くのサイトで即座にブロックされます。特にCloudflareやAkamaiなどのWAF/ボット対策システムは、データセンターIPのASNを判定材料に使います。レジデンシャルプロキシは実際のISPに割り当てられたIPを使用するため、通常ユーザーと同じように見えます。99.9%のアップタイムを維持しながら、ターゲットサイトのブロック率を大幅に下げられます。
| プロキシタイプ | レイテンシ | ブロック率 | 適した用途 |
|---|---|---|---|
| データセンター | 50-100ms | 高 | 制限の緩いAPI |
| レジデンシャル | 150-300ms | 低 | SERP、ECサイト、SNS |
| モバイル | 300-800ms | 極低 | 最も厳しいターゲット |
実践例:WebPageでHTTPからChromiumへ切り替える
ここからは、ProxyHatのレジデンシャルプロキシを使った実践的な例を示します。HTTPモードで開始し、必要に応じてChromiumモードに切り替えます。
from DrissionPage import WebPage
import uuid
def build_username(country='US', session_id=None):
"""ProxyHatユーザー名を構築"""
if session_id is None:
session_id = str(uuid.uuid4())[:8]
return f'user-country-{country}-session-{session_id}'
# ProxyHatレジデンシャルプロキシ
PROXY_USER = build_username(country='US', session_id='abc123')
PROXY_PASS = 'your_password'
PROXY_URL = f'http://{PROXY_USER}:{PROXY_PASS}@gate.proxyhat.com:8080'
# WebPageを初期化(HTTPモードで開始)
page = WebPage()
# SessionPageモードでプロキシ設定
page.set.proxies(PROXY_URL)
# ステップ1: HTTPモードでAPIエンドポイントを叩く
page.get('https://api.example.com/products?page=1')
data = page.json
print(f'HTTPモード: {len(data["products"])}件取得')
# ステップ2: JSレンダリングが必要なページに切り替え
page.change_mode() # ChromiumPageモードへ切替、Cookieは共有される
# ブラウザモードでもプロキシを設定
page.set.proxy(PROXY_URL)
# listenでXHRをキャプチャ
page.listen.start('api/products')
page.get('https://example.com/dashboard')
packet = page.listen.wait(timeout=10)
if packet:
print(f'XHRキャプチャ: {packet.response.body[:200]}')
この例のポイントは、-session-abc123 フラグによってIPがセッション中固定されることです。ログイン状態を維持したままモードを切り替える場合、同じIPを使い続ける必要があります。ProxyHatのスティッキーセッション機能は、最大30分間同じIPを維持できます。
DrissionPage chromiumの本番パターン
セッション固定プロキシ
ログイン後のスクレイピングでは、IPが途中で変わるとセッションが無効になります。ProxyHatの -session-{id} フラグでIPを固定し、リトライ時も同じIPを使い続けます。
import uuid
import time
def scrape_with_retry(url, max_retries=3):
session_id = str(uuid.uuid4())[:8]
proxy_user = f'user-country-US-session-{session_id}'
proxy_url = f'http://{proxy_user}:pass@gate.proxyhat.com:8080'
page = WebPage()
page.set.proxies(proxy_url)
for attempt in range(max_retries):
try:
page.get(url, timeout=15)
if page.status_code == 200:
return page.html
time.sleep(2 ** attempt) # 指数バックオフ
except Exception as e:
print(f'試行{attempt+1}失敗: {e}')
time.sleep(2 ** attempt)
return None
listenによる隠しAPIの発見
SPAサイトでは、フロントエンドが内部的にJSON APIを呼び出していることが多いです。listen機能でこれを傍受すれば、ブラウザを使い続ける必要がなくなります。
page = ChromiumPage()
page.listen.start('api/') # api/を含む全リクエストをキャプチャ
page.get('https://target-spa.com')
# ページ操作をトリガー
page.ele('@class=load-more').click()
packets = page.listen.wait(timeout=10, count=5)
for p in packets:
print(f'{p.url} -> {p.response.status}')
隠しAPIを発見したら、次回からはSessionPageでそのAPIを直接叩くことで、ブラウザを起動せずにデータを取得できます。
並行処理の制限
ChromiumPageは1プロセスあたり200〜500MBのメモリを消費します。100並行セッションを張る場合、メモリだけでも20〜50GB必要になります。実用的なアプローチは、SessionPageタスクは100並行、ChromiumPageタスクは5〜10並行に制限することです。
from concurrent.futures import ThreadPoolExecutor, as_completed
def scrape_url(url):
page = SessionPage()
proxy_user = f'user-country-US-session-{uuid.uuid4().hex[:8]}'
page.set.proxies(f'http://{proxy_user}:pass@gate.proxyhat.com:8080')
page.get(url)
return page.html
urls = ['https://example.com/page/1', 'https://example.com/page/2']
with ThreadPoolExecutor(max_workers=20) as executor:
futures = [executor.submit(scrape_url, url) for url in urls]
for f in as_completed(futures):
result = f.result()
# 結果を処理
ブラウザを使うべきでないケース
DrissionPageの強みは「必要な時だけブラウザを使える」ことです。以下のケースではSessionPage(HTTPモード)で十分です:
- 静的HTMLページのスクレイピング
- 公開JSON APIへのアクセス
- ログイン不要のページ
- listenで発見した隠しAPIの直接呼び出し
逆に、以下のケースではChromiumPageへの切り替えが適切です:
- JavaScriptでレンダリングされるコンテンツ(React/Vue/Angular製SPA)
- Cloudflareのチャレンジページ(Turnstile)
- ユーザー操作が必要な動的コンテンツ(無限スクロール、ボタンクリック)
- XHR/Fetchのキャプチャが必要な場合
判断基準はシンプルです。まずHTTPでアクセスし、目的のデータが取得できればそのまま続行。取得できなければChromiumPageに切り替える。この「段階的エスカレーション」こそがDrissionPageの設計思想です。
ProxyHat固有の設定とリンク
ProxyHatのプロキシエンドポイントは以下の形式を使用します:
- HTTP:
http://USERNAME:PASSWORD@gate.proxyhat.com:8080 - SOCKS5:
socks5://USERNAME:PASSWORD@gate.proxyhat.com:1080
ユーザー名にフラグを埋め込むことで、ジオターゲティングとセッション制御を行います:
user-country-US— 米国IPuser-country-DE-city-berlin— ベルリンIPuser-session-abc123— スティッキーセッション(最大30分)
利用可能なロケーションについてはプロキシロケーション一覧を確認してください。価格についてはProxyHat料金プランを参照してください。Webスクレイピング全般のユースケースはスクレイピングユースケースで、SERP追跡についてはSERPトラッキングで詳しく解説しています。技術的な詳細はProxyHat公式ドキュメントもご覧ください。
Key Takeaways
- DrissionPageは1つのツールでHTTPとブラウザを統合——SessionPage、ChromiumPage、WebPageの使い分けでコストとパフォーマンスを最適化
- プロキシ設定はクラス別——SessionPageは
set.proxies()、ChromiumPageはChromiumOptions.set_proxy() - レジデンシャルプロキシでブロック回避——ProxyHatの
-country-と-session-フラグでジオターゲティングとIP固定 - listen.start()で隠しAPIを発見——XHRをキャプチャし、次回からはHTTPモードで直接取得
- 段階的エスカレーション——まずHTTPで試し、必要な時だけブラウザに切り替える
- 並行処理は計画的に——SessionPageは高並行、ChromiumPageは5〜10並行に制限
FAQ
DrissionPageとは何ですか?
DrissionPageは、Python向けのWeb自動化フレームワークで、HTTP通信とChromiumブラウザ制御を1つのツールに統合しています。requests風のSessionPage、CDP駆動のChromiumPage、両方を切り替えられるWebPageの3つのクラスを提供し、タスクに応じて軽量なHTTP通信とブラウザレンダリングを使い分けられます。SeleniumのようなWebDriverを経由しないため、ブラウザ操作のオーバーヘッドも少ないのが特徴です。
DrissionPageでプロキシを使う理由は何ですか?
スクレイピング対象サイトの多くが、データセンターIPや短時間に大量アクセスするIPをブロックしています。レジデンシャルプロキシを使うことで、実際のISP IPからのアクセスとして認識され、ブロック率を大幅に下げられます。また、ジオターゲティングで地域ごとのコンテンツを取得したり、スティッキーセッションでログイン状態を維持したりする目的でもプロキシは必須です。
DrissionPageに最適なプロキシタイプはどれですか?
用途によりますが、一般的にはレジデンシャルプロキシが最適です。データセンタープロキシは高速ですがブロックされやすく、モバイルプロキシはブロックされにくいもののレイテンシが高くなります。レジデンシャルプロキシは、レイテンシ150〜300msと実用的な速度を維持しながら、SERPスクレイピングやECサイトの価格監視などで高い成功率を発揮します。最も厳しいターゲットにはモバイルプロキシを検討してください。
DrissionPageでブロックを回避するにはどうすればよいですか?
レジデンシャルプロキシの使用、セッション固定によるIPの一貫性維持、適切なUser-Agentの設定、リクエスト間隔の調整が基本です。ChromiumPageを使えば実際のブラウザと同じフィンガープリントでアクセスできます。さらに、listen機能で隠しAPIを発見し、ブラウザを使わずに直接APIを叩くことで、ボット検知の対象を減らせます。robots.txtの尊重とレート制限の遵守も長期的な成功に不可欠です。
DrissionPageでSOCKS5プロキシは使えますか?
はい、使えます。ChromiumOptionsで co.set_proxy('socks5://user:pass@gate.proxyhat.com:1080') のように設定できます。SessionPageでも同様にSOCKS5 URLを指定可能です。SOCKS5はHTTPプロキシよりも低レイヤーで動作し、UDPもサポートするため、特定のネットワーク環境で有利な場合があります。ただし、ほとんどのWebスクレイピング用途ではHTTPプロキシ(ポート8080)で十分です。






