Google Maps
URL шаблон: https://www.google.com/maps/place/{name}/@{lat},{lng},{zoom}/data=!.../!1s{place_id}!...
Источник данных: ScraperAPI (render=true) для базовой инфо + Playwright (Chromium со stealth) для отзывов
Стратегия парсинга
- Этап 1: GET через ScraperAPI render=true. Здесь полезен `country_code` (например `de`), иначе Google может отдать страницу на случайном языке (тайском, эстонском и т.д.).
- Парсим базовые поля **язык-агностично**: phone берём из `data-item-id="phone:tel:+..."`, address из `<div class="Io6YTe">` внутри блока с `data-item-id="address"`, rating через мультиязычный regex (`stars`/`ดาว`/`étoiles`/`Sterne`/...) или `role="img" aria-label="X.X"`.
- Этап 2: открываем тот же URL в Playwright с stealth (маскировка webdriver). Ждём, кликаем cookie consent, открываем вкладку Reviews.
- Скроллим панель отзывов до 25 раз (или пока новые не перестанут появляться) — каждые 5 итераций считаем количество карточек.
- Из DOM собираем все `.jftiEf` карточки: автор, звёзды, дата, текст, профиль, прикреплённые фото.
Поля ресторана
| поле | откуда / как | пример |
|---|---|---|
name | <title> до " - Google Maps" / " – Google Maps" | 'Frau Möller' |
category | class="DkEaL" — содержимое (локализовано) | 'German restaurant' или 'ภัตตาคารอาหารเยอрманий' |
address | <div class="Io6YTe"> внутри data-item-id="address" | 'Lange Reihe 96, 20099 Hamburg, Germany' |
phone | data-item-id="phone:tel:..." → после tel: | '+494025328817' |
website | data-item-id="authority" → href | 'https://fraumoeller.com/' |
rating | role="img" aria-label="X.X" / мультиязычный regex | 4.5 |
num_reviews | aria-label с числом + словом "review"/локализованным | 9158 |
hours / open_status | aria-label по дням недели + блок Hours (англ.) | {friday:'10am-3am',...} |
coordinates | из URL (@lat,lng / !3d{lat}!4d{lng}) | {lat:'53.55', lng:'10.01'} |
place_id | из URL (!1s{place_id}!) | '0x47b18eddafc2c67b:0x6b630b9e560ac71b' |
page_lang | атрибут lang="..." у <html> — для отладки | 'en' / 'th' / 'et' |
Поля отзыва
| поле | откуда / как | пример |
|---|---|---|
name | .d4r55 — имя автора | 'Иван Иванов' |
stars | aria-label первых "stars" чисел | '5' |
date | .rsqaWe | '2 weeks ago' |
text | .wiI7pd / .MyEned span | 'Очень вкусно, рекомендую!' |
profile_url | a[href*="contrib"] | 'https://maps.google.com/...' |
review_photos | все img/url-bg в карточке кроме аватара | ['https://...googleusercontent...'] |
Пример запроса
{
"platform": "googlemaps",
"url": "https://www.google.com/maps/place/name/@lat,lng,zoom/data=!.../!1splace_id!..."
}
Опции options.scraperapi описаны в общей документации.
Нюансы
- Локаль страницы зависит от прокси ScraperAPI. Для немецкого ресторана ставьте `country_code: "de"`.
- Часы работы парсятся только если страница на английском — нужно делать мультиязычным.
- Фотографии приходят как URL с googleusercontent.com — мы их НЕ скачиваем, только URL.
- Если Google показал капчу или AB-вариант без отзывов — массив будет пустой, не падаем.