Requests vs Selenium vs Playwright スクレイピング比較
Python Web スクレイピングの主要ライブラリであるRequests、Selenium、Playwrightの詳細比較。パフォーマンス、使いやすさ、コスト、適用シーンを実例とともに解説。
Requests(軽量・高速)、Selenium(汎用性・実績)、Playwright(現代的・高性能)の特徴を比較。静的サイトはRequests、JavaScriptサイトはPlaywright、レガシーシステムはSeleniumが最適。2025年の推奨はPlaywright。
Webスクレイピングツール選択の重要性
適切なスクレイピングツールの選択は、プロジェクトの成功を左右する重要な要素です。プロキシサービス完全ガイドで解説したプロキシ環境と組み合わせることで、効率的なデータ収集システムを構築できます。
各ツールの基本特徴
Requests - 軽量HTTP ライブラリ
概要
- Pythonの標準的なHTTPライブラリ
- シンプルで学習コストが低い
- 静的なWebページの取得に特化
主な特徴
- 高速処理(秒間数千リクエスト対応)
- 軽量(メモリ使用量最小)
- プロキシサポート内蔵
- セッション管理機能
Selenium - ブラウザ自動化フレームワーク
概要
- 実際のブラウザを制御
- 豊富な実績と安定性
- 複雑なJavaScriptサイトに対応
主な特徴
- 全主要ブラウザ対応
- 豊富なドキュメント
- 大規模なコミュニティ
- WebDriverプロトコル準拠
Playwright - 現代的ブラウザ自動化
概要
- Microsoft開発の次世代ツール
- 高性能・高速処理
- 現代的なWeb技術に最適化
主な特徴
- 並行処理サポート
- 自動待機機能
- ネットワーク制御
- 高度なデバッグ機能
詳細比較分析
パフォーマンス比較
処理速度(1000ページ処理時間)
- Requests: 45秒
- Playwright: 120秒
- Selenium: 180秒
メモリ使用量
- Requests: 50MB
- Playwright: 200MB
- Selenium: 350MB
CPU使用率
- Requests: 低(15%)
- Playwright: 中(45%)
- Selenium: 高(65%)
学習コストと開発効率
Requests
import requests
from bs4 import BeautifulSoup
# シンプルなスクレイピング例
def scrape_with_requests(url):
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
titles = soup.find_all('h2', class_='title')
return [title.text.strip() for title in titles]
Selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def scrape_with_selenium(url):
driver = webdriver.Chrome()
driver.get(url)
# 要素が読み込まれるまで待機
titles = WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CLASS_NAME, "title"))
)
results = [title.text for title in titles]
driver.quit()
return results
Playwright
from playwright.sync_api import sync_playwright
def scrape_with_playwright(url):
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto(url)
# 自動待機機能
titles = page.locator('.title').all_text_contents()
browser.close()
return titles
適用シーン別の推奨
1. 静的サイトの大量処理
推奨:Requests
- 理由:圧倒的な処理速度
- 用途:ニュースサイト、商品情報など
- 注意点:JavaScriptレンダリング不可
2. SPA(Single Page Application)
推奨:Playwright
- 理由:現代的なJavaScript対応
- 用途:React、Vue.js製サイト
- 利点:自動待機・エラー処理
3. レガシーシステム
推奨:Selenium
- 理由:豊富な実績と安定性
- 用途:古いWebアプリケーション
- 利点:トラブル時の情報が豊富
実践的な使い分け戦略
プロジェクト要件による選択
データ量重視型
# 大量データ処理にはRequests
import requests
import concurrent.futures
from itertools import islice
def batch_scrape_requests(urls, batch_size=100):
"""大量URLの効率的処理"""
results = []
with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor:
for batch in batch_iterator(urls, batch_size):
futures = [executor.submit(requests.get, url) for url in batch]
batch_results = [f.result() for f in futures]
results.extend(batch_results)
return results
品質重視型
# 高品質データ取得にはPlaywright
from playwright.sync_api import sync_playwright
def quality_scrape_playwright(url):
"""高品質データ取得"""
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context(
viewport={'width': 1920, 'height': 1080},
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
)
page = context.new_page()
# ネットワーク制御
page.route("**/*.{png,jpg,jpeg,gif,svg}", lambda route: route.abort())
page.goto(url)
page.wait_for_load_state('networkidle')
data = page.evaluate('''() => {
return {
title: document.title,
content: document.body.innerText,
links: Array.from(document.links).map(link => link.href)
};
}''')
browser.close()
return data
プロキシ連携の実装
Requests + Bright Data
import requests
from itertools import cycle
def requests_with_proxy_rotation(urls, proxy_list):
"""プロキシローテーション付きRequests"""
proxy_cycle = cycle(proxy_list)
results = []
for url in urls:
proxy = next(proxy_cycle)
proxy_config = {
'http': f'http://{proxy}',
'https': f'https://{proxy}'
}
try:
response = requests.get(url, proxies=proxy_config, timeout=10)
results.append(response.text)
except Exception as e:
print(f"Error with proxy {proxy}: {e}")
return results
2025年の推奨ランキング
総合評価
1位:Playwright
- 理由:現代的な機能と高性能
- 適用率:新規プロジェクトの70%
- 成長率:年間150%
2位:Requests
- 理由:シンプルさと処理速度
- 適用率:軽量処理の85%
- 特徴:変わらぬ安定性
3位:Selenium
- 理由:豊富な実績とサポート
- 適用率:レガシーシステムの60%
- 傾向:徐々にPlaywrightに移行
技術トレンド
Playwright の優位点
- 自動待機機能
- 並行処理サポート
- ネットワーク制御
- 高度なデバッグ機能
将来性の考慮
- Playwright:積極的な開発継続
- Selenium:安定運用重視
- Requests:シンプルな用途で継続
費用対効果の分析
開発・運用コスト比較
初期開発コスト
- Requests: 低(学習コスト最小)
- Selenium: 中(豊富な資料)
- Playwright: 中(現代的だが新しい)
運用コスト
- Requests: 低(サーバーリソース最小)
- Selenium: 高(ブラウザリソース大)
- Playwright: 中(効率的なリソース使用)
メンテナンスコスト
- Requests: 低(シンプルな構造)
- Selenium: 中(Web標準への追従)
- Playwright: 低(自動更新機能)
ROI 計算例
# コスト効率計算例
def calculate_scraping_roi(tool_type, pages_per_hour, monthly_pages):
"""スクレイピングツールのROI計算"""
costs = {
'requests': {'dev': 50, 'server': 20, 'maintenance': 10},
'selenium': {'dev': 100, 'server': 150, 'maintenance': 50},
'playwright': {'dev': 80, 'server': 80, 'maintenance': 30}
}
monthly_cost = sum(costs[tool_type].values())
efficiency = pages_per_hour * 24 * 30 # 月間処理可能ページ数
if monthly_pages <= efficiency:
roi = (monthly_pages / efficiency) * 100
return {'cost': monthly_cost, 'roi': roi}
else:
return {'cost': monthly_cost, 'roi': 0, 'error': 'Capacity exceeded'}
よくある質問
Q: JavaScriptが多用されたサイトにはどのツールが最適ですか? A: Playwrightが最適です。自動待機機能と高速処理により、現代的なWebサイトに対応できます。
Q: 大量データの処理にはどれが良いですか? A: Requestsが最適です。1秒間に数千リクエストを処理でき、メモリ使用量も最小限です。
Q: 初心者にはどのツールがおすすめですか? A: Requestsから始めることをお勧めします。学習コストが低く、基本的なスクレイピングを理解できます。
Q: 複雑なフォーム操作が必要な場合は? A: SeleniumまたはPlaywrightが適しています。フォーム入力、クリック操作等のブラウザ操作が可能です。
Q: プロキシとの連携ではどのツールが優れていますか? A: すべてのツールでプロキシ連携可能ですが、Requestsが最もシンプルで効率的です。
実装時の注意点
エラーハンドリング
import time
import random
def robust_scraping(url, tool_type='requests', max_retries=3):
"""堅牢なスクレイピング実装"""
for attempt in range(max_retries):
try:
if tool_type == 'requests':
response = requests.get(url, timeout=10)
response.raise_for_status()
return response.text
elif tool_type == 'playwright':
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto(url)
content = page.content()
browser.close()
return content
except Exception as e:
if attempt < max_retries - 1:
sleep_time = random.uniform(1, 3) * (attempt + 1)
time.sleep(sleep_time)
continue
else:
raise e
パフォーマンスモニタリング
import psutil
import time
def monitor_scraping_performance(scraping_function, *args):
"""スクレイピング性能監視"""
start_time = time.time()
start_memory = psutil.Process().memory_info().rss / 1024 / 1024 # MB
result = scraping_function(*args)
end_time = time.time()
end_memory = psutil.Process().memory_info().rss / 1024 / 1024 # MB
metrics = {
'execution_time': end_time - start_time,
'memory_usage': end_memory - start_memory,
'pages_processed': len(result) if isinstance(result, list) else 1
}
return result, metrics
まとめ
2025年のWebスクレイピングにおいて、適切なツール選択は以下の要素を考慮することが重要です:
選択基準
- データ量: 大量処理 → Requests
- サイトの複雑さ: JavaScript多用 → Playwright
- 学習コスト: 初心者 → Requests
- 将来性: 新規プロジェクト → Playwright
継続的な技術進歩により、ツールの特性も変化しています。プロキシ品質監視方法と組み合わせることで、より安定したスクレイピングシステムを構築できます。
プロジェクトの要件に応じて最適なツールを選択し、効率的なデータ収集システムを構築しましょう。
Bright Data
30日間無料世界最大のプロキシネットワーク
参考情報: