プロキシがレビューデータのスクレイピングにどう役立つか
ブランドモニタリング、競合分析、市場調査のいずれが目的でも、レビューデータの収集は重要なタスクです。しかし、Trustpilot、G2、Googleビジネスなどの主要プラットフォームは、単一IPからの大量リクエストを厳しく制限しています。プロキシがレビューデータのスクレイピングにどう役立つかを理解することで、これらの制限を回避しつつ、公開データを効率的かつ継続的に収集できるようになります。
免責事項:本記事で扱うのは公開データのみです。各プラットフォームの利用規約(ToS)を遵守し、米国のCFAAやEUのGDPRなど適用される法律に従ってください。ログインが必要なページや個人情報(PII)の収集は対象外です。
レビューページが厳しくレート制限される理由
レビュープラットフォームは、ユーザー体験の保護とスクレイピング対策のために、複数のレイヤーでアクセス制御を行っています。
- レート制限:多くのプラットフォームは、同一IPから短時間に大量リクエストを送信すると、HTTP 429(Too Many Requests)を返します。一般的なしきい値は1分あたり50〜100リクエスト程度です。
- 地域パーソナライゼーション:GoogleビジネスやG2は、アクセス元IPの地理位置に基づいて表示するレビューを変更します。例えば、日本のIPからアクセスすると日本語のレビューが優先的に表示される場合があります。
- ボット検出:ブラウザフィンガープリント、TLSフィンガープリント、ヘッダーの一貫性などをチェックし、自動化ツールを検出します。
単一IPでこれらの制限に直面すると、データ収集が途中で止まったり、不完全なデータセットになる可能性があります。Webスクレイピングのユースケースでも詳しく解説しているように、回転型レジデンシャルプロキシはこれらの問題を解決する鍵となります。
Trustpilotレビューのスクレイピング実装
Trustpilotは、ビジネスプロフィールページのURLパターンが予測可能で、?page=Nパラメータでページネーションが可能です。重要なのは、HTMLを直接パースするのではなく、ページに埋め込まれた__NEXT_DATA__JSONを抽出することです。これにより、DOM構造の変更によるスクリプト破損リスクを大幅に減らせます。
以下のPythonスニペットは、ProxyHatの回転型レジデンシャルプロキシを使ってTrustpilotの複数ページからレビューを収集する例です。各ページリクエストでIPがローテーションされるため、レート制限に引っかかるリスクを分散できます。
import requests
import json
from bs4 import BeautifulSoup
PROXY = "http://user-country-US:pass@gate.proxyhat.com:8080"
proxies = {"http": PROXY, "https": PROXY}
def scrape_trustpilot_reviews(domain, max_pages=10):
all_reviews = []
for page in range(1, max_pages + 1):
url = f"https://www.trustpilot.com/review/{domain}?page={page}"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept-Language": "en-US,en;q=0.9",
}
resp = requests.get(url, headers=headers, proxies=proxies, timeout=30)
if resp.status_code == 429:
print(f"Rate limited on page {page}, retrying...")
continue
soup = BeautifulSoup(resp.text, "html.parser")
script_tag = soup.find("script", id="__NEXT_DATA__")
if script_tag:
data = json.loads(script_tag.string)
reviews = data.get("props", {}).get("pageProps", {}).get("reviews", [])
for r in reviews:
all_reviews.append({
"title": r.get("title"),
"text": r.get("text"),
"rating": r.get("rating"),
"date": r.get("dates", {}).get("publishedDate"),
})
print(f"Page {page}: {len(reviews)} reviews collected")
return all_reviews
reviews = scrape_trustpilot_reviews("example.com", max_pages=5)
print(f"Total: {len(reviews)} reviews")
この例ではuser-country-USを指定して米国のレジデンシャルIPを使用しています。ProxyHatの回転型プロキシはリクエストごとに新しいIPを割り当てるため、1分あたり100リクエスト以上の並行収集でも429エラーを回避しやすくなります。
G2レビューのスクレイピングとアンチボット対策
G2はTrustpilotよりも強力なアンチボット対策を導入しており、データセンタープロキシでは高確率でブロックされます。レジデンシャルプロキシとリアルなブラウザヘッダーの組み合わせが不可欠です。MDNのHTTPヘッダーリファレンスを参照し、Accept、Accept-Language、Sec-Fetch-*ヘッダーを適切に設定してください。
import requests
import random
import time
def scrape_g2_reviews(product_slug, max_pages=5):
base_url = f"https://www.g2.com/products/{product_slug}/reviews"
all_reviews = []
for page in range(1, max_pages + 1):
# ページごとにセッションIDを変更してIPをローテーション
session_id = f"g2-page-{page}-{random.randint(1000,9999)}"
proxy = f"http://user-country-US-session-{session_id}:pass@gate.proxyhat.com:8080"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
}
resp = requests.get(f"{base_url}?page={page}", headers=headers,
proxies={"http": proxy, "https": proxy}, timeout=30)
if resp.status_code == 200:
print(f"Page {page}: status {resp.status_code}, {len(resp.text)} bytes")
# レビュー抽出ロジックをここに実装
else:
print(f"Page {page}: status {resp.status_code}")
time.sleep(2) # リクエスト間隔を空ける
return all_reviews
G2のスクレイピングでは、リクエスト間に2〜5秒の遅延を入れることが重要です。セッションIDをページごとに変更することで、各ページリクエストが異なるレジデンシャルIPから送信されます。G2はCloudflareベースの保護を使用していることが多く、データセンタープロキシのIPレピュテーションでは即座にチャレンジが発生します。
Googleビジネスレビューのスクレイピングと地域ターゲティング
Googleビジネス(旧Googleマイビジネス)のレビューは、hl(言語)とgl(地域)パラメータによって表示されるレビューが大きく変わります。例えばhl=ja&gl=JPを指定すると日本語レビューが優先されますが、アクセス元IPの地域も影響するため、プロキシのgeo-targetingと組み合わせる必要があります。
SERPトラッキングのユースケースでも触れているように、Googleの検索結果やレビューは地域ごとに異なるデータセットが返されます。一貫したデータを取得するには、プロキシの国設定とURLパラメータを一致させる必要があります。
import requests
def scrape_google_reviews(place_id, country="US", language="en"):
proxy = f"http://user-country-{country}:pass@gate.proxyhat.com:8080"
url = f"https://www.google.com/maps/place/?q=place_id:{place_id}"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept-Language": f"{language},{language[:2]};q=0.9",
}
params = {"hl": language, "gl": country}
resp = requests.get(url, headers=headers, params=params,
proxies={"http": proxy, "https": proxy}, timeout=30)
print(f"Status: {resp.status_code}, Locale: {language}/{country}")
# レビューデータの抽出処理
return resp.text
国を指定する場合はuser-country-USのようにプロキシユーザー名に国コードを組み込みます。利用可能なロケーションから目的の国を選択してください。米国のレジデンシャルIPでgl=USを指定すれば、米国ユーザーに表示されるレビューと同じデータセットにアクセスできます。
ProxyHatを使ったスティッキーセッション実装
複数ページにまたがるプロフィールのスクレイピングでは、同一IPでセッションを維持する「スティッキーセッション」が有用です。-session-abc123フラグを使うと、指定したセッションIDの間は同じIPが割り当てられます。セッションの有効期限は通常10〜30分程度です。
import requests
def scrape_with_sticky_session(domain, session_id="profile-abc123"):
proxy = f"http://user-country-US-session-{session_id}:pass@gate.proxyhat.com:8080"
proxies = {"http": proxy, "https": proxy}
all_reviews = []
for page in range(1, 6):
url = f"https://www.trustpilot.com/review/{domain}?page={page}"
resp = requests.get(url, proxies=proxies, timeout=30)
print(f"Page {page} via sticky session: {resp.status_code}")
# 同一IPで全ページを取得し、一貫したデータセットを維持
return all_reviews
スティッキーセッションは、ログイン状態に依存しないページネーションや、同一IPでないと一貫したデータが返されない場合に特に有効です。ただし、長時間のスクレイピングではセッション期限切れに注意し、必要に応じて新しいセッションIDを生成してください。
Node.jsでのレビュースクレイピング実装
Node.js環境でもProxyHatを簡単に利用できます。以下はaxiosとhttps-proxy-agentを使った例です。
const axios = require("axios");
const { HttpsProxyAgent } = require("https-proxy-agent");
async function scrapeReviews(domain, maxPages = 5) {
const allReviews = [];
for (let page = 1; page <= maxPages; page++) {
const session = `tp-${page}-${Date.now()}`;
const proxyUrl = `http://user-country-US-session-${session}:pass@gate.proxyhat.com:8080`;
const agent = new HttpsProxyAgent(proxyUrl);
try {
const resp = await axios.get(
`https://www.trustpilot.com/review/${domain}?page=${page}`,
{
httpsAgent: agent,
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept-Language": "en-US,en;q=0.9",
},
timeout: 30000,
}
);
console.log(`Page ${page}: ${resp.status}, ${resp.data.length} bytes`);
// __NEXT_DATA__の抽出とパース処理
} catch (err) {
console.error(`Page ${page} failed: ${err.message}`);
}
await new Promise((r) => setTimeout(r, 2000));
}
return allReviews;
}
scrapeReviews("example.com", 5);
プロキシタイプ比較:レビュースクレイピング向け
| プロキシタイプ | Trustpilot | G2 | Googleビジネス | 推奨用途 |
|---|---|---|---|---|
| レジデンシャル(回転) | ◎ | ◎ | ◎ | ほぼ全てのレビュースクレイピング |
| レジデンシャル(スティッキー) | ○ | △ | ○ | ページネーションの一貫性が必要な場合 |
| モバイル | ○ | ◎ | ○ | モバイル向けレビューの収集 |
| データセンター | △ | ✗ | ✗ | 高速だがブロックされやすい |
レビュースクレイピングでは、レジデンシャルプロキシが最も汎用性の高い選択肢です。ProxyHatの料金プランでレジデンシャルプロキシの詳細を確認できます。データセンタープロキシはレイテンシが50ms未満と高速ですが、G2やGoogleではIPレピュテーションチェックで即座にブロックされるため、レビュー収集には不向きです。
よくある失敗とエッジケース
- HTMLセレクタへの過度な依存:TrustpilotのHTML構造は頻繁に変更されます。
__NEXT_DATA__JSONをパースすることで、DOM変更の影響を最小限に抑えられます。 - 不適切なリクエスト間隔:1秒未満の間隔でリクエストを送ると、レート制限が即座に発動します。2〜5秒の間隔を推奨します。
- geo-targetingの不一致:プロキシの国設定と
glパラメータが一致していないと、Googleは異なるレビューセットを返す場合があります。 - セッション期限切れ:スティッキーセッションの有効期限(通常10〜30分)を超えるとIPが変更され、ページネーションがリセットされる可能性があります。
- JavaScriptレンダリングの必要性:一部のプラットフォームはレビューをクライアントサイドでレンダリングします。この場合、Requestsライブラリだけでは不十分で、PlaywrightやSeleniumの使用を検討してください。
倫理的スクレイピングと公式APIの利用
スクレイピングを行う前に、以下を確認してください。
- robots.txtの確認:RFC 9309に準拠し、各プラットフォームのrobots.txtでスクレイピングが許可されているか確認します。
- 公式APIの優先:Google Business Profile APIやTrustpilot Business APIなど、公式APIが提供されている場合は、そちらを優先的に使用してください。API経由の方がデータ構造が安定し、レート制限も明確です。
- データの最小化:レビューのテキスト、評価、日付など、分析に必要な最小限のデータのみを収集し、レビュアーの個人情報は抽出しないでください。
- 利用規約の遵守:各プラットフォームのToSを確認し、スクレイピングが禁止されていないか確認します。
詳細なプロキシ設定や認証オプションについては、ProxyHatドキュメントを参照してください。
Key Takeaways
- レビュープラットフォームは、レート制限、地域パーソナライゼーション、ボット検出の3つのレイヤーでスクレイピングを防いでいる。
- 回転型レジデンシャルプロキシは、Trustpilot・G2・Googleビジネスすべてで最も信頼性の高い選択肢。
- Trustpilotは
__NEXT_DATA__JSONのパースが推奨され、HTMLセレクタへの依存を避けるべき。 - G2はレジデンシャルIPとリアルなブラウザヘッダーの組み合わせが必須。データセンタープロキシでは高確率でブロックされる。
- Googleビジネスは
hl/glパラメータとプロキシのgeo-targetingを一致させる必要がある。 - スティッキーセッションはページネーションの一貫性に有効だが、10〜30分の有効期限に注意。
- 公開データのみを対象とし、各プラットフォームのToSと適用法を遵守すること。公式APIが利用可能な場合はそちらを優先。






