Важное предупреждение: перед скрапингом TripAdvisor ознакомьтесь с их Условиями использования (Terms of Service). В США несанкционированный доступ к данным может нарушать Computer Fraud and Abuse Act (CFAA), а в ЕС обработка персональных данных регулируется GDPR. Данное руководство covers только публично доступные данные и предназначено для образовательных целей.
Если вы разрабатываете систему аналитики отзывов для гостиничного или ресторанного бизнеса, вам нужен надёжный способ собирать данные с TripAdvisor. Но в 2026 году скрапинг TripAdvisor — это не просто HTTP-запросы с BeautifulSoup. Платформа использует многоуровневую анти-бот защиту, которая блокирует наивные подходы за минуты. В этом руководстве мы разберём, как скрапить отзывы TripAdvisor с помощью residential прокси, TLS-имперсонации и GraphQL endpoint.
Что такое парсинг отзывов TripAdvisor и что доступно публично
TripAdvisor — крупнейший в мире туристический портал с более чем 1 миллиардом отзывов и мнений по состоянию на 2024 год. Для разработчиков аналитики путешествий это ценнейший источник данных: рейтинги, тексты отзывов, даты публикации, категории отелей и ресторанов.
Публично доступные данные включают:
- Страницы отелей — URL вида
/Hotel_Review-g187147-d188679-Reviews-Hotel_Name-City.html, содержащие рейтинг, количество отзывов, категории удобств. - Страницы ресторанов — URL вида
/Restaurant_Review-g187147-d2593814-Reviews-Restaurant_Name-City.htmlс аналогичной структурой. - Тексты отзывов — заголовок, рейтинг (1–5 звёзд), полный текст, дата публикации, имя автора (публичный никнейм).
- Ответы администрации — текстовые ответы от представителей отеля/ресторана.
Однако TripAdvisor лениво загружает отзывы через AJAX. Первая страница содержит 5–10 отзывов в HTML, а остальные подгружаются динамически через внутренние API-вызовы. Это означает, что простой парсинг HTML-страницы даст вам лишь малую часть данных. Для полного извлечения нужно работать с underlying API.
Ключевой вывод: TripAdvisor не отдаёт все отзывы в исходном HTML. Большинство данных загружается через GraphQL-запросы, инициируемые JavaScript-фронтендом.
Анти-бот защита TripAdvisor: Cloudflare + DataDome
TripAdvisor использует один из самых агрессивных анти-бот стеков в индустрии. Вот что вам предстоит преодолеть:
Cloudflare Bot Management
Cloudflare Bot Management анализирует входящий трафик на уровне TLS, HTTP/2 и TCP. Он проверяет JA3/JA4 fingerprints, порядок заголовков, HTTP/2 frame settings и соответствие User-Agent реальному TLS-профилю браузера. Если вы используете requests или urllib, ваш TLS fingerprint не совпадёт с заявленным User-Agent Chrome — и вы получите HTTP 403.
DataDome
DataDome — второй слой защиты, специализирующийся на detection через JavaScript challenges, behavioural analysis и device fingerprinting. DataDome особенно эффективен против datacenter IP-адресов: даже если вы идеально имитируете браузер, дата-центровый IP почти гарантированно получит CAPTCHA challenge.
Почему datacenter IP не работают
Вот сравнение типов прокси для скрапинга TripAdvisor:
| Тип прокси | Success rate на TripAdvisor | Риск блокировки | Подходит для |
|---|---|---|---|
| Datacenter | ~5–15% | Очень высокий | Не рекомендуется |
| Mobile | ~90–95% | Низкий | Высоконагруженный скрапинг |
| Residential | ~85–92% | Низкий | Оптимальный выбор |
Datacenter IP-адреса принадлежат ASN, ассоциированным с облачными провайдерами (AWS, GCP, Azure, OVH). TripAdvisor и его анти-бот вендоры ведут списки этих ASN и автоматически помечают запросы с них как подозрительные. Residential прокси используют IP реальных интернет-провайдеров, что делает ваш трафик неотличимым от обычного пользователя.
GraphQL endpoint TripAdvisor и необходимость residential прокси
Когда вы открываете страницу отеля на TripAdvisor и скроллите вниз, фронтенд отправляет POST-запросы к внутреннему GraphQL endpoint:
POST https://www.tripadvisor.com/data/graphql/ids
Content-Type: application/json
X-Requested-By: TAcrawl
Referer: https://www.tripadvisor.com/
Этот endpoint принимает GraphQL-запросы и возвращает структурированные данные о локациях и отзывах. Заголовок X-Requested-By служит CSRF-токеном и обязателен для каждого запроса. Точное значение можно найти в DevTools браузера на вкладке Network.
GraphQL-запрос для получения отзывов выглядит примерно так:
{
"query": "query getLocationReviews($locationId: String!) {
locations(ids: [$locationId]) {
reviewList(page: { offset: 0, limit: 10 }) {
reviews {
title
rating
text
publishedDate
userProfile {
displayName
}
}
}
}
}",
"variables": { "locationId": "188679" }
}
Для локализованных листингов (например, отзывы британских отелей на английском TripAdvisor) требуется гео-таргетинг прокси. Residential IP из Великобритании обеспечит правильную локализацию контента и снизит риск блокировки. С ProxyHat это делается через параметры в username:
http://user-country-GB-city-london-session-hotel123:pass@gate.proxyhat.com:8080
Параметр -session-hotel123 создаёт sticky-сессию: все запросы в рамках сессии идут с одного IP, что критично для пагинации — TripAdvisor отслеживает смену IP в середине сессии.
Python-пример: curl_cffi + ProxyHat для скрапинга TripAdvisor
Для обхода TLS-фingerprinting Cloudflare используем библиотеку curl_cffi, которая поддерживает имперсонацию Chrome на уровне TLS. Установите её:
pip install curl_cffi
Полный пример скрапинга отзывов через GraphQL endpoint:
from curl_cffi import requests
import json
import time
import random
# ProxyHat residential proxy с гео-таргетингом и sticky-сессией
proxy_url = "http://user-country-GB-city-london-session-hotel123:pass@gate.proxyhat.com:8080"
graphql_payload = {
"query": """
query getLocationReviews($locationId: String!, $offset: Int!) {
locations(ids: [$locationId]) {
reviewList(page: { offset: $offset, limit: 10 }) {
reviews {
title
rating
text
publishedDate
}
}
}
}
""",
"variables": {
"locationId": "188679",
"offset": 0
}
}
headers = {
"Content-Type": "application/json",
"X-Requested-By": "TAcrawl",
"Referer": "https://www.tripadvisor.com/Hotel_Review-g187147-d188679-Reviews.html",
"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"
}
def scrape_reviews(location_id, max_pages=5):
all_reviews = []
for page in range(max_pages):
offset = page * 10
graphql_payload["variables"]["offset"] = offset
graphql_payload["variables"]["locationId"] = location_id
try:
response = requests.post(
"https://www.tripadvisor.com/data/graphql/ids",
json=graphql_payload,
headers=headers,
proxies={"https": proxy_url, "http": proxy_url},
impersonate="chrome120",
timeout=30
)
if response.status_code == 200:
data = response.json()
reviews = data["data"]["locations"][0]["reviewList"]["reviews"]
for r in reviews:
review = {
"title": r.get("title", ""),
"rating": r.get("rating", 0),
"text": r.get("text", "")[:500], # truncate
"publishedDate": r.get("publishedDate", "")
}
all_reviews.append(review)
print(f'{review["title"]} | {review["rating"]}/5 | {review["publishedDate"]}')
print(f"Page {page+1}: {len(reviews)} reviews fetched")
else:
print(f"HTTP {response.status_code}, backing off...")
time.sleep(random.uniform(60, 120))
continue
# Random delay между запросами: 3–8 секунд
time.sleep(random.uniform(3, 8))
except Exception as e:
print(f"Error: {e}, retrying in 60s...")
time.sleep(60)
return all_reviews
reviews = scrape_reviews("188679", max_pages=5)
print(f"Total reviews scraped: {len(reviews)}")
Этот код имперсонирует Chrome 120 на уровне TLS, использует residential IP из Лондона и поддерживает sticky-сессию для пагинации. Текст каждого отзыва обрезается до 500 символов — это намеренное решение для агрегированной аналитики (см. раздел об этическом скрапинге).
Пример на curl
Для быстрого тестирования одного запроса:
curl -X POST 'https://www.tripadvisor.com/data/graphql/ids' \
-H 'Content-Type: application/json' \
-H 'X-Requested-By: TAcrawl' \
-H 'Referer: https://www.tripadvisor.com/' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' \
--proxy 'http://user-country-GB-city-london-session-test1:pass@gate.proxyhat.com:8080' \
--impersonate chrome120 \
-d '{"query":"query{locations(ids:[\"188679\"]) {reviewList{reviews{title rating text publishedDate}}}}"}'
Пример на Node.js
Для JavaScript/TypeScript разработчиков можно использовать undici с ProxyAgent:
import { fetch, ProxyAgent } from 'undici';
const proxyUrl = 'http://user-country-GB-city-london-session-hotel456:pass@gate.proxyhat.com:8080';
const dispatcher = new ProxyAgent(proxyUrl);
const query = `
query getLocationReviews($locationId: String!) {
locations(ids: [$locationId]) {
reviewList(page: { offset: 0, limit: 10 }) {
reviews { title rating text publishedDate }
}
}
}
`;
const response = await fetch('https://www.tripadvisor.com/data/graphql/ids', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-By': 'TAcrawl',
'Referer': 'https://www.tripadvisor.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
},
body: JSON.stringify({
query,
variables: { locationId: '188679' }
}),
dispatcher
});
const data = await response.json();
const reviews = data.data.locations[0].reviewList.reviews;
reviews.forEach(r => {
console.log(`${r.title} | ${r.rating}/5 | ${r.publishedDate}`);
console.log(r.text.substring(0, 200));
});
Примечание: для полноценной TLS-имперсонации в Node.js рассмотрите использование cycletls или запуск через Playwright с прокси.
Rate limits, сессии, пагинация и backoff
Реалистичные параметры скрапинга TripAdvisor на 2026 год:
- Скорость: 50–100 листингов в час на один IP. Превышение этого порога почти гарантированно вызывает CAPTCHA или временный бан.
- Сброс блокировки: 5–10 минут после первого предупреждения. При повторных нарушениях — до 24 часов.
- Задержка между запросами: 3–8 секунд случайной задержки на запрос. Не используйте фиксированные интервалы — паттерн легко детектируется.
- Параллельные сессии: не более 3–5 одновременных сессий с разных IP для одного домена.
Sticky-сессии для пагинации
При пагинации отзывов критично использовать одну sticky-сессию на весь процесс сбора одного листинга. Если IP меняется посередине пагинации, TripAdvisor может вернуть ошибку или неполные данные. С ProxyHat sticky-сессия задаётся параметром -session-{id} в username:
# Сессия для отеля A
http://user-country-GB-city-london-session-hotelA:pass@gate.proxyhat.com:8080
# Другая сессия для отеля B (другой IP)
http://user-country-GB-city-london-session-hotelB:pass@gate.proxyhat.com:8080
Стратегия backoff
При получении HTTP 403 или 429:
- Немедленно остановите запросы на этом IP.
- Дождитесь 5–10 минут (экспоненциальный backoff: 60s → 120s → 300s → 600s).
- Смените session ID для получения нового IP.
- Возобновите с последней успешной страницы.
Подробнее о настройке прокси-сессий смотрите в документации ProxyHat. Полный список доступных гео-локаций — на странице локаций ProxyHat.
Этический скрапинг и когда использовать официальный API
Скрапинг TripAdvisor требует осознанного подхода к данным. Вот ключевые принципы:
Собирайте только агрегированные данные
Для аналитики отзывов вам обычно нужны агрегаты: средний рейтинг, распределение оценок, объём отзывов по месяцам, ключевые темы в текстах. Не нужно хранить полные тексты отзывов или персональные данные авторов. Обрезайте текст отзыва до 200–500 символов — этого достаточно для sentiment analysis и тематического моделирования.
GDPR для отзывов из ЕС
Отзывы на TripAdvisor содержат публичные никнеймы авторов. Согласно GDPR, персональные данные — это любая информация, связанная с идентифицируемым лицом. Публичный никнейм в сочетании с датой и текстом отзыва может считаться персональными данными. Если вы обрабатываете отзывы пользователей из ЕС:
- Не храните displayName авторов — используйте только анонимизированные агрегаты.
- Не объединяйте данные отзывов с другими источниками для деанонимизации.
- Удаляйте сырые данные после агрегации.
- Документируйте цели обработки данных.
Когда использовать официальный Content API
TripAdvisor предлагает Content API для партнёров. Если ваш use case — коммерческая интеграция отелей или туристических платформ, официальный API — правильный выбор. Он предоставляет структурированный доступ к отзывам и рейтингам в рамках лицензионного соглашения.
Скрапинг оправдан, когда:
- Вам нужна аналитика по конкурентам (Content API отдаёт только ваши собственные объекты).
- Вы проводите академическое исследование.
- Вы собираете рыночные данные для price intelligence.
Подробнее о применении прокси для веб-скрапинга — на странице use case по веб-скрапингу и SERP-трекингу. Тарифы ProxyHat — на странице цен.
Ключевые выводы
- TripAdvisor использует Cloudflare + DataDome — datacenter IP блокируются независимо от заголовков. Нужны residential прокси.
- GraphQL endpoint
/data/graphql/ids— основной источник структурированных данных. ЗаголовокX-Requested-Byобязателен.- TLS-имперсонация критична — используйте curl_cffi (Python) или аналоги для соответствия JA3/JA4 fingerprint Chrome.
- Sticky-сессии для пагинации — параметр
-session-{id}в username ProxyHat сохраняет IP на весь цикл сбора.- Скорость: 50–100 листингов/час на IP — превышение вызывает блокировку на 5–10 минут.
- Этика: агрегируйте данные, не храните персональные данные — соблюдайте GDPR для отзывов из ЕС.
Готовы начать? Настройте residential прокси ProxyHat с гео-таргетингом и запустите первый тестовый запрос. Для production-нагрузок используйте ротацию сессий и мониторинг success rate — это позволит поддерживать 85–92% успешных запросов даже при агрессивной анти-бот защите TripAdvisor.






