本物のブラウザでGoogle Mapsの検索結果をスクレイピングし、ページ上のすべてのスポットを取得します。名前、評価、レビュー、カテゴリ、住所、営業時間、座標が対象です。読み込みに失敗したページは無料です。
無料リクエスト1,000件 · 課金は成功時のみ · 195以上の国 · Claude対応
チームについて簡単にご記入いただくと、次の内容をお届けします。
Google Mapsの検索は、アプリでもAPIでも約60件で止まります。代わりに都市をタイルに分けましょう。タイルが1つ増えるごとに同じ料金でページが1つ増え、リストは伸び続けます。
25タイル検索(各1ページ)の料金
Gologin Web Unlocker約$0.02
Google Places API約$0.80
公式APIが返すのは、Googleが選んだ項目だけです。Mapsのページにはもっと多くの情報があり、Web Unlockerはページ全体を返します。
| 取得できるもの | Google Places API | |
|---|---|---|
| 電話番号とウェブサイト付きの1,000スポット | 約$1.10 | 約$1.75 |
| 星別の評価内訳(5から1) | あり | なし(平均のみ) |
| 件数付きのレビュートピック | あり | なし |
| オンライン予約リンク | あり | なし(有無のフラグのみ) |
| 結果の保存 | 当社の制限なし | Place IDのみ |
Google Maps以外もスクレイピングしますか?Web Unlockerなら、どのページも同じ方法、同じ料金で返します。
Google Mapsは、検索元の場所に合わせてスポットを並べ替えます。国、地域、都市を選ぶと、Web Unlockerがそこから地図を読み込みます。
お客様の都市から検索してみませんか?APIキーと無料リクエストを入手しましょう。
検索1回につきリクエスト1回。Mapsのアドレスを送ると、レンダリング済みのページが返るので、スポットを読み取ります。上のデモも同じパーサーで動いています。
上のフォームにご記入ください。キーは1営業日以内にメールで届きます。
google.com/maps/search/ に検索語を付け、検索元の国、地域、都市を指定します。
各スポットはページ上の1枚のカードで、名前、評価、レビュー、住所、営業時間がそのまま見えます。
GOLOGIN_SCRAPING_API_KEY=your_key node maps-search.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst search = 'dentists in Miami';
const params = new URLSearchParams({
url: `https://www.google.com/maps/search/${encodeURIComponent(search)}?hl=en&ucbcb=1`,
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 },
});
const { data } = await response.json();
const text = (value) => value?.replaceAll('&', '&').replaceAll(''', "'").replaceAll('"', '"');
const places = data.html
.split('role="article"')
.slice(1)
.map((card) => ({
name: text(card.match(/class="hfpxzc" aria-label="([^"]+)"/)?.[1]),
rating: card.match(/>([1-5]\.\d)</)?.[1],
reviews: card.match(/>\(([\d,]+)\)</)?.[1],
lat: card.match(/!3d(-?[\d.]+)/)?.[1],
lng: card.match(/!4d(-?[\d.]+)/)?.[1],
}));
console.table(places);pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python maps_search.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport html as entities
import os
import re
from urllib.parse import quote
import requests
search = "dentists in Miami"
response = requests.get(
"https://parsing.webunlocker.gologin.com/v1/scrape",
params={
"url": f"https://www.google.com/maps/search/{quote(search)}?hl=en&ucbcb=1",
"render_js": "true",
"wait": "9000",
"geo": "us",
"format": "json",
},
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
timeout=90,
)
html = response.json()["data"]["html"]
def find(pattern, card):
match = re.search(pattern, card)
return entities.unescape(match.group(1)) if match else None
for card in html.split('role="article"')[1:]:
print(
find(r'class="hfpxzc" aria-label="([^"]+)"', card),
find(r">([1-5]\.\d)<", card),
find(r">\(([\d,]+)\)<", card),
find(r"!3d(-?[\d.]+)", card),
find(r"!4d(-?[\d.]+)", card),
)GOLOGIN_SCRAPING_API_KEY=your_key node maps-tiles.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst query = 'dentists';
const center = { lat: 25.775, lng: -80.23 };
const step = 0.03;
const found = new Map();
async function tile(lat, lng) {
const params = new URLSearchParams({
url: `https://www.google.com/maps/search/${query}/@${lat},${lng},15z?hl=en&ucbcb=1`,
render_js: 'true',
wait: '9000',
geo: 'us',
format: 'json',
});
for (let attempt = 0; attempt < 3; attempt += 1) {
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
if (response.ok) return (await response.json()).data.html;
await new Promise((resolve) => setTimeout(resolve, 10000));
}
return '';
}
for (let row = -2; row <= 2; row += 1) {
for (let col = -2; col <= 2; col += 1) {
const html = await tile((center.lat + row * step).toFixed(4), (center.lng + col * step).toFixed(4));
for (const card of html.split('role="article"').slice(1)) {
const name = card.match(/class="hfpxzc" aria-label="([^"]+)"/)?.[1];
if (name) found.set(name, { name, lat: card.match(/!3d(-?[\d.]+)/)?.[1], lng: card.match(/!4d(-?[\d.]+)/)?.[1] });
}
console.log(`tile ${row},${col}: ${found.size} places so far`);
}
}
console.table([...found.values()]);先にクリック、スクロール、レビュータブの表示が必要ですか?Cloud Browserなら、コードからブラウザ全体を操作できます。
検索ページには最大7スポットが並び、各スポットのページで電話番号とウェブサイトが加わります。1ページあたり同じ料金なので、連絡先付きの1,000スポットは約$1.10です。
難しいページも
簡単なページと同じ料金です。
読み込みに失敗したページは無料です。料金がかかるのは、レンダリングされたページだけです。
電話番号とウェブサイト付き1,000スポットの料金
他社の公開価格
GrowthプランのWeb Unlocker、1,000ページあたり$0.98。
1つのアカウント、1つのプロキシネットワーク、1つのエコシステム。用途に合った製品をお選びください。
Google Mapsの検索アドレスをWeb Unlockerに送ります。選んだ国から本物のブラウザでページを開き、レンダリング済みのHTMLを返します。各スポットは1枚のカードに収まっているので、短いパーサーで名前、評価、レビュー、カテゴリ、住所、営業時間、座標を読み取れます。上のコードがまさにその処理です。
requestsライブラリでMapsの検索アドレスをWeb Unlockerに送り、HTMLからスポットを読み取ります。上のPythonタブは37行の完全なスクリプトで、実際のAPIでテスト済みです。
検索結果とスポットのページは公開されており、ログインなしで読み込めます。Web Unlockerは訪問者のブラウザと同じようにページを読み込んで返します。何を収集し、どう使うかはお客様の判断ですので、プロジェクトに適用されるルールに照らして確認してください。
1ページあたり約7〜11件で、1回の検索で約60件を超えることはありません。Googleは、アプリでもAPIでも、リストをそこで止めます。都市全体を取得するには、地図をタイルごとに検索します。マイアミ全域の25タイルで、146件の異なる歯科医院を約2セントで取得できました。上のコードの「都市全体」タブがまさにその処理です。
はい。検索結果からスポットのページを開くと、電話番号、ウェブサイト、プラスコード、予約リンク(ある場合)が載っています。リクエストが1回増えるだけで、料金は同じです。
Google Mapsに表示されるのはスポットのウェブサイトで、メールアドレスではありません。メールアドレスはそのウェブサイトに載っており、Web Unlockerは同じ方法でそのサイトを開きます。ページが1つ増えるだけで、料金は同じです。
スポットのページをスクレイピングします。レビューの概要、星ごとの評価数、よく挙がるトピックとその件数、そして投稿者、星、日付、全文付きの上位レビューが載っています。
Web Unlockerが返すのは表ではなくページなので、取得前に何も削られません。CSVへの変換は数行のコードか、1回のプロンプトで済みます。Gologin scraping skillを使ってページをClaudeに渡し、CSVを依頼してください。
はい。国、地域、都市を指定すると、そこからページが読み込まれます。結果は検索元の場所に応じて変わるため、同じ検索語でもマイアミと東京では異なるスポットが返ります。
当社のテストでは5〜30秒です。ページを返す前に、本物のブラウザで地図を読み込むためです。
レンダリング済みのHTML、Markdown、プレーンテキスト、ページのメタデータ付きJSONです。
1,000ページあたり$1未満で、どのページも同じ料金です。電話番号とウェブサイト付きの1,000スポットで約$1.10です。読み込みに失敗したページは無料です。プランは50,000リクエストで月$49からです。
はい、まずは無料で試せます。Web Unlockerには1,000件の無料リクエストが付き、検索ページ約1,000枚、またはスポット約7,000件に相当します。その後は1,000ページあたり$1未満です。
いいえ。Web Unlockerが195以上の国からIPを選びます。
目的によります。ApifyとOutscraperは、スポットごとの完成した表を提供します。Web Unlockerは、どの都市からでもMapsのページ全体を1ページ1つの料金で返すため、すべての項目が手元に残り、自分の方法で解析できます。
チームについて簡単にご記入いただくと、次の内容をお届けします。