店舗名を入力すると、Web UnlockerがそのGoogleレビューのページを返します。評価、星ごとの評価数、よく挙がるトピック、本文付きの上位レビューが、1ページ分の料金で取得できます。読み込みに失敗したページは無料です。
無料リクエスト1,000件 · 課金は成功時のみ · 195以上の国 · Claude対応
チームについて簡単にご記入いただくと、次の内容をお届けします。
店舗のGoogle Mapsページには、評価、星ごとの件数、よく挙がるトピック、上位レビューが載っており、Web Unlockerは1ページとして課金します。Google Places APIはコールごとに課金し、返すレビューは5件です。レビュースクレイパーはレビューごとに課金します。
難しいページも
簡単なページと同じ料金です。
読み込みに失敗したページは無料です。料金がかかるのは、レンダリングされたページだけです。
Googleレビュー1,000店舗分の料金
上位レビュー付きの店舗ページ1,000件、公開価格で
GrowthプランのWeb Unlocker、1,000ページあたり$0.98。他社は、それらのページにある3,000件のレビュー、またはレビュー5件ずつの1,000コールに課金します。
公式APIは1店舗あたり5件のレビューで止まり、コールごとに課金します。レビュースクレイパーはレビューごとに課金します。同じ1,000店舗を取得する場合に、各方法で必要になるものは次のとおりです。
| 必要なもの | Google Places API | Apify | Outscraper | |
|---|---|---|---|---|
| Google APIキーなしで開始 | あり | なし | あり | あり |
| 課金の対象 | 1ページ | 1コール | レビューごと | レビューごと |
| 上位レビュー付きの1,000店舗 | $0.98 | $25 | $1.80 | $9 |
| 星別の評価内訳(5から1) | あり | なし(平均のみ) | なし | あり |
| 件数付きのレビュートピック | あり | なし | なし | なし |
| ページ全体をHTMLまたはMarkdownで | あり | なし | なし | なし |
Googleレビュー以外もスクレイピングしますか?Web Unlockerなら、どのページも同じ方法、同じ料金で返します。
Web Unlockerに通知機能はありません。スクリプトが1日1回、各店舗のページを開きます。評価やレビュー数が動いていれば、新しいレビューがあります。1,000店舗で1日$0.98です。
レビュー監視ツールは1店舗あたり月$65から。
自作のチェックは1回$0.001です。
店舗1件につきリクエスト1回。店舗のGoogle Mapsアドレスを送ると、レンダリング済みのページが返るので、評価、星ごとの件数、トピック、レビューを読み取ります。上のデモも同じパーサーで動いています。
上のフォームにご記入ください。キーは1営業日以内にメールで届きます。
google.com/maps/search/ に店舗名と都市を付け、開く国を指定します。
ページには、評価、星ごとの件数、件数付きのトピック、そして投稿者、星、日付、本文付きの上位レビューが載っています。
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python google_reviews.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport json
import os
import re
import time
from urllib.parse import quote_plus
import requests
place = "Franklin Barbecue Austin"
address = f"https://www.google.com/maps/search/{quote_plus(place)}?hl=en&ucbcb=1"
html = ""
for attempt in range(3):
response = requests.get(
"https://parsing.webunlocker.gologin.com/v1/scrape",
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
params={
"url": address if attempt == 0 else f"{address}&_r={int(time.time())}",
"render_js": "true",
"wait": "9000",
"geo": "us",
"format": "json",
},
timeout=120,
)
html = response.json().get("data", {}).get("html", "")
if 'data-review-id="' in html:
break
def first(pattern):
match = re.search(pattern, html)
return match.group(1) if match else None
blocks = {}
for match in re.finditer(r'data-review-id="([^"]+)"', html):
blocks.setdefault(match.group(1), match.start())
starts = sorted(blocks.values()) + [len(html)]
reviews = []
for start, end in zip(starts, starts[1:]):
block = html[start:end]
author = re.search(r'class="d4r55[^"]*"[^>]*>([^<]+)<', block)
text = re.search(r'class="wiI7pd"[^>]*>([^<]*)<', block)
if author and text:
stars = re.search(r'aria-label="(\d) stars?"', block)
date = re.search(r'class="rsqaWe"[^>]*>([^<]+)<', block)
reviews.append({
"author": author.group(1),
"stars": int(stars.group(1)) if stars else None,
"date": date.group(1) if date else None,
"text": text.group(1),
})
print(json.dumps({
"name": first(r"<h1[^>]*>([^<]+)"),
"rating": first(r'class="F7nice[^"]*"[^>]*>\s*<span><span aria-hidden="true">([\d.]+)<'),
"ratings": first(r'aria-label="([\d,]+) reviews?">\('),
"stars": {level: first(rf'aria-label="{level} stars?, ([\d,]+) reviews?"') for level in "54321"},
"topics": dict(re.findall(r'aria-label="([^",]+), mentioned in ([\d,]+) reviews?"', html)),
"reviews": reviews,
}, indent=2, ensure_ascii=False))GOLOGIN_SCRAPING_API_KEY=your_key node reviews-batch.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst places = [
'Franklin Barbecue Austin',
'Katz Delicatessen New York',
'Relax and Smile Dental Care Miami',
];
const number = (text) => (text ? Number(text.replace(/,/g, '')) : null);
async function pageOf(place, attempt) {
const address = `https://www.google.com/maps/search/${encodeURIComponent(place).replace(/%20/g, '+')}?hl=en&ucbcb=1`;
const params = new URLSearchParams({
url: attempt === 1 ? address : `${address}&_r=${Date.now()}`,
render_js: 'true',
wait: '9000',
geo: 'us',
format: 'json',
});
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
return (await response.json()).data?.html ?? '';
}
async function reviewsOf(place) {
let html = '';
for (let attempt = 1; attempt <= 3 && !html.includes('data-review-id='); attempt += 1) {
html = await pageOf(place, attempt);
}
const star = (level) => number(html.match(new RegExp(`aria-label="${level} stars?, ([\\d,]+) reviews?"`))?.[1]);
return {
place: html.match(/<h1[^>]*>([^<]+)/)?.[1] ?? place,
rating: number(html.match(/class="F7nice[^"]*"[^>]*>\s*<span><span aria-hidden="true">([\d.]+)</)?.[1]),
ratings: number(html.match(/aria-label="([\d,]+) reviews?">\(/)?.[1]),
fiveStar: star(5),
oneStar: star(1),
topReview: html.match(/class="wiI7pd"[^>]*>([^<]{0,80})/)?.[1],
};
}
const rows = [];
for (const place of places) rows.push(await reviewsOf(place));
console.table(rows);GOLOGIN_SCRAPING_API_KEY=your_key node reviews-watch.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { readFile, writeFile } from 'node:fs/promises';
const places = ['Franklin Barbecue Austin', 'Katz Delicatessen New York', 'Relax and Smile Dental Care Miami'];
const FILE = 'reviews.json';
const number = (text) => (text ? Number(text.replace(/,/g, '')) : null);
async function pageOf(place, attempt) {
const address = `https://www.google.com/maps/search/${encodeURIComponent(place).replace(/%20/g, '+')}?hl=en&ucbcb=1`;
const params = new URLSearchParams({
url: attempt === 1 ? address : `${address}&_r=${Date.now()}`,
render_js: 'true',
wait: '9000',
geo: 'us',
format: 'json',
});
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
return (await response.json()).data?.html ?? '';
}
async function countOf(place) {
let html = '';
for (let attempt = 1; attempt <= 3 && !html.includes('data-review-id='); attempt += 1) {
html = await pageOf(place, attempt);
}
return {
rating: number(html.match(/class="F7nice[^"]*"[^>]*>\s*<span><span aria-hidden="true">([\d.]+)</)?.[1]),
ratings: number(html.match(/aria-label="([\d,]+) reviews?">\(/)?.[1]),
};
}
const before = JSON.parse(await readFile(FILE, 'utf8').catch(() => '{}'));
const today = { ...before };
for (const place of places) {
const now = await countOf(place);
const was = before[place]?.ratings ?? null;
if (now.ratings === null) console.log(`${place}: no page today, ask again`);
else if (was === null) console.log(`${place}: first check, ${now.ratings} ratings, ${now.rating} stars`);
else if (now.ratings > was) console.log(`${place}: ${now.ratings - was} new, now ${now.ratings} ratings, ${now.rating} stars`);
else console.log(`${place}: nothing new`);
if (now.ratings !== null) today[place] = now;
}
await writeFile(FILE, JSON.stringify(today, null, 2));先に店舗の一覧が必要ですか?Google Mapsスクレイパーが都市内のカテゴリのすべての店舗を一覧にし、各店舗はここでもう1ページになります。
1つのアカウント、1つのプロキシネットワーク、1つのエコシステム。用途に合った製品をお選びください。
店舗自体もスクレイピングしますか?Google Mapsスクレイパー、RedditとYouTubeのスクレイパー、またはすべてのWebスクレイピングツールをご覧ください。
店舗のGoogle MapsアドレスをWeb Unlockerに送ります。google.com/maps/search/ に名前と都市を付けたものです。選んだ国から本物のブラウザでページを開き、評価、星ごとの件数、よく挙がるトピック、そして投稿者、星、日付、本文付きの上位レビューとともに返します。上のコードがまさにその処理です。
requestsライブラリで店舗のアドレスをWeb Unlockerに送り、ページから各項目を読み取ります。上のPythonタブは完全なスクリプトで、実際のAPIでテスト済みです。
はい。店舗のGoogle Mapsページは公開されており、ログインなしで読み込めます。Web Unlockerは訪問者のブラウザと同じ見え方でページを返すため、Google Cloudプロジェクトも、APIキーも、承認も不要です。
公式のものが2つあります。Google Places APIは店舗の評価と最大5件のレビューを、1,000コールあたり$25で返します。Google Business Profile APIはすべてのレビューを無料で返しますが、自分で所有または管理している拠点に限られます。その5件を超える他店舗のレビューを星別の内訳付きで取得するには、Web UnlockerがMapsのページそのものを返します。
それが公式に定められた上限です。Place Detailsが返すのは1店舗あたり最大5件のレビューで、関連度順に並び、1,000コールあたり$25のSKUで提供されます。返るのは平均評価のみで、星別の内訳はありません。Mapsのページには星ごとの件数とレビューのトピックが載っており、Web Unlockerはページ全体を返します。
全文付きの上位3件のレビューに加え、評価、星ごとの件数、件数付きのトピックです。2026年9月以降、Google Mapsは店舗のレビュー一覧の全体をサインイン後にのみ表示するため、公開ページを読み取るどのツールもその範囲になります。自分の拠点なら、Google Business Profile APIがすべてのレビューを無料で返します。
公開ページからはできません。Googleは完全な一覧と並べ替えのオプションをGoogleのサインインの先に置いています。公開されたままなのは概要と上位レビューで、それが1ページ1つの料金で返ります。
並べ替えもサインインが必要です。ページには上位レビューが載っています。新しいレビューを見つけるには、レビュー数と評価を前回の実行と比べます。上の「毎日のチェック」タブが、店舗のリストに対してそれを行います。
はい。すべての店舗について、星ごとに何件の評価が付いたか(5から1)が取得できます。テスト当日のオースティンのFranklin Barbecueは、星5が6,053件、星4が695件、星3が285件、星2が104件、星1が199件でした。
はい、2段階です。Google Mapsスクレイパーがカテゴリの店舗をタイルごとに一覧にし、各店舗はここでもう1ページになります。マイアミの146件の歯科医院は25の検索ページから得られ、146件のレビューページを加えて171ページ、合計で約17セントです。
拠点を所有または管理している場合は、Google Business Profile APIを使います。Googleがプロジェクトを承認すれば、拠点のすべてのレビューを1ページ50件ずつ無料で取得できます。Web Unlockerは、自分で管理していない店舗向けです。
Web Unlockerが返すのは表ではなくページなので、取得前に何も削られません。CSVへの変換は数行のコードか、1回のプロンプトで済みます。Gologin scraping skillを使ってページをClaudeに渡し、CSVを依頼してください。
1,000ページあたり$1未満で、どのページも同じ料金です。レビュー付きの1,000店舗で$0.98です。読み込みに失敗したページは無料です。プランは50,000リクエストで月$49からです。
はい、まずは無料で試せます。Web Unlockerには1,000件の無料リクエストが付き、レビュー付きの店舗1,000件に相当します。
いいえ。Web Unlockerが195以上の国からIPを選び、選んだ国からページを開きます。
目的によります。ApifyとOutscraperは完成した行を提供し、レビューごとに課金します。Web Unlockerは、Mapsのページ全体を1ページ1つの料金で返すため、行では省かれる星別の内訳とトピックも手元に残り、自分の方法で解析できます。
店舗のMapsページは公開されており、ログインなしで読み込めます。Web Unlockerは訪問者のブラウザと同じようにページを読み込んで返します。何を収集し、どう使うかはお客様の判断ですので、プロジェクトに適用されるルールに照らして確認してください。
チームについて簡単にご記入いただくと、次の内容をお届けします。