プロキシがレビューデータのスクレイピングにどう役立つか:Trustpilot・G2・Googleビジネスの実装ガイド

回転型レジデンシャルプロキシを使ってTrustpilot、G2、Googleビジネスの公開レビューデータを収集する実装方法を解説。Python・Node.jsのコード例とgeo-targetingのベストプラクティスを紹介します。

How Proxies Help You Scrape Reviews Data: Trustpilot, G2 & Google Business
この記事の内容

プロキシがレビューデータのスクレイピングにどう役立つか

ブランドモニタリング、競合分析、市場調査のいずれが目的でも、レビューデータの収集は重要なタスクです。しかし、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を簡単に利用できます。以下はaxioshttps-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);

プロキシタイプ比較:レビュースクレイピング向け

プロキシタイプTrustpilotG2Googleビジネス推奨用途
レジデンシャル(回転)ほぼ全てのレビュースクレイピング
レジデンシャル(スティッキー)ページネーションの一貫性が必要な場合
モバイルモバイル向けレビューの収集
データセンター高速だがブロックされやすい

レビュースクレイピングでは、レジデンシャルプロキシが最も汎用性の高い選択肢です。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が利用可能な場合はそちらを優先。

よくある質問

プロキシはレビューデータのスクレイピングにどう役立ちますか?

プロキシはリクエストごとに異なるIPアドレスを割り当てることで、プラットフォームのレート制限やIPベースのブロックを回避します。特にレジデンシャルプロキシは実際のISP IPを使用するため、データセンタープロキシよりもボット検出に引っかかりにくく、Trustpilot・G2・Googleビジネスなどの厳しいアンチボット対策を回避できます。また、geo-targeting機能により地域ごとのレビューデータにアクセスできます。

レビュースクレイピングにどのプロキシタイプが最適ですか?

レビュースクレイピングにはレジデンシャルプロキシが最適です。G2やGoogleビジネスはデータセンタープロキシのIPレピュテーションをチェックして即座にブロックするため、実際のISPから割り当てられたレジデンシャルIPが不可欠です。ページネーションの一貫性が必要な場合はスティッキーセッション機能を使い、複数ページを同じIPで取得できます。モバイルプロキシはG2のCloudflare保護に対しても高い成功率を示します。

Trustpilotのレビューをスクレイピングするにはどうすればよいですか?

Trustpilotのスクレイピングでは、HTMLセレクタではなくページに埋め込まれた__NEXT_DATA__というJSONをパースすることを推奨します。URLパターンはhttps://www.trustpilot.com/review/{domain}?page=Nでページネーションが可能です。ProxyHatの回転型レジデンシャルプロキシをgate.proxyhat.com:8080に設定し、user-country-USで米国IPを指定することで、レート制限を回避しながら複数ページのレビューを安定して収集できます。

G2のレビューをスクレイピングする際のブロックを回避する方法は?

G2はCloudflareベースの強力なアンチボット保護を使用しているため、レジデンシャルプロキシとリアルなブラウザヘッダーの組み合わせが必須です。Sec-Fetch-*ヘッダー、Accept-Language、最新のUser-Agentを適切に設定し、リクエスト間に2〜5秒の遅延を入れてください。ページごとにセッションIDを変更してIPをローテーションし、データセンタープロキシは絶対に使用しないでください。

Googleビジネスレビューのスクレイピングで国別データを取得するには?

Googleビジネスレビューでは、hlパラメータで言語、glパラメータで地域を指定できます。ただしアクセス元IPの地域も影響するため、ProxyHatのgeo-targeting機能でuser-country-USのようにプロキシの国を指定し、glパラメータと一致させる必要があります。これにより、対象国のユーザーに表示されるレビューセットと同じデータにアクセスできます。

始める準備はできましたか?

AIフィルタリングで148か国以上、5,000万以上のレジデンシャルIPにアクセス。

料金を見るレジデンシャルプロキシ
← ブログに戻る