输入酒店、餐厅或景点,Web Unlocker 就返回它的 Tripadvisor 页面:评分、排名、各项得分和带业主回复的评论,每页 10 条,按 1 页计费。页面加载失败不收费。
1,000 次免费请求 · 仅成功时计费 · 195+ 个国家和地区 · 适配 Claude
简单介绍一下您的团队,即可获得:
一个 Tripadvisor 酒店页面包含 10 条评论,餐厅页面包含 15 条,连同评分和业主回复,Web Unlocker 按 1 页计费。Apify 或 Bright Data 上的 Tripadvisor 评论采集工具则按每条评论计费。
再难的页面,
价格与普通页面相同。
页面加载失败不收费。波士顿 The Godfrey Hotel 的 9,260 条英文评论共 926 页:$0.91。
10,000 条 Tripadvisor 评论的费用
1,000 个各含 10 条评论的酒店页面,按公布价格计算
Web Unlocker 的 Growth 套餐,每 1,000 个页面 $0.98。其他产品按每条评论计费:Bright Data 按即用即付价格,Apify 上使用最多的 actor 按 Apify 的 $19 套餐,Outscraper 在其 500 条免费评论之后。
准备好用在您自己的酒店上了吗?获取 API 密钥和免费请求额度。
我们的 Tripadvisor 采集测试:一百个页面,每个一次请求,不重试:从波士顿到东京的酒店、深入酒店历史的评论页面、餐厅、景点和城市列表。下面是返回的结果和速度。
没有返回的页面计费 $0。
您为页面付费,而不是为尝试次数付费。
Tripadvisor 向每位访客显示每一条评论,酒店页面每页 10 条,餐厅页面每页 15 条,每一页都链接到下一页。您的 Tripadvisor 爬虫顺着这个链接一直读到最后一页:波士顿的 The Godfrey Hotel 共 926 页,一直追溯到 2016 年 1 月的第一条评论。
Tripadvisor 自己的 API 提供的是由合同设定的评论池。
页面显示每一条评论。
Tripadvisor 网页采集每页只需一个请求:发送酒店、餐厅或景点的 Tripadvisor 地址,取回页面,读取评分、排名和评论。每一页都链接到下一页,所以每一条评论都只差一个循环。
填写上面的表单。密钥会在一个工作日内通过邮件送达。
它在您浏览器中打开时的 Tripadvisor 页面地址,以及要从哪个国家打开。
页面包含评分、排名和 10 到 15 条评论,每条评论都有评分、正文、日期和业主回复。
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python tripadvisor_reviews.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport json
import os
import re
import time
from html import unescape
import requests
address = "https://www.tripadvisor.com/Hotel_Review-g60745-d8316858-Reviews-The_Godfrey_Hotel_Boston-Boston_Massachusetts.html"
def scrape(url):
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": url if attempt == 0 else f"{url}?_r={int(time.time())}",
"geo": "us",
"format": "json",
},
timeout=120,
)
html = response.json().get("data", {}).get("html", "")
if "ShowUserReviews-" in html:
return html
return html
def text(markup):
return unescape(re.sub(r"\s+", " ", re.sub(r"<[^>]+>", " ", markup.replace("<!-- -->", "")))).strip()
def first(pattern, source):
match = re.search(pattern, source)
return text(match.group(1)) if match else None
html = scrape(address)
place = {}
for block in re.findall(r'<script[^>]*application/ld\+json[^>]*>(.*?)</script>', html, re.S):
data = json.loads(block)
if "aggregateRating" in data:
place = data
break
cards = re.split(r'data-test-target="HR_CC_CARD"|data-automation="reviewCard"', html)[1:]
reviews = []
for card in cards:
title = first(r'<a[^>]+ShowUserReviews[^>]+>(.*?)</a>', card)
if not title:
continue
body = card.split("</h3>", 1)[1]
body = body[body.find('data-test-target="review-body"'):] if 'data-test-target="review-body"' in body else body
reviews.append({
"author": first(r'href="/Profile/[^"]+"[^>]*>(?:<span[^>]*>)?([^<]+)<', card),
"rating": first(r"<title[^>]*>([\d.]+) of 5 bubbles</title>", card),
"title": title,
"text": text(re.split(r"<button|Date of stay:|<div[^>]*>Written ", body)[0]),
"date_of_stay": first(r"Date of stay:(?:<[^>]+>)+([^<]+)<", card),
"owner_reply": "Response from " in card,
})
next_page = re.search(r'aria-label="Next page" href="([^"]+)"', html)
print(json.dumps({
"name": place.get("name"),
"rating": place.get("aggregateRating", {}).get("ratingValue"),
"reviews_total": place.get("aggregateRating", {}).get("reviewCount"),
"ranking": first(r"(#[\d,]+ of [\d,]+ [^<\"]+?)(?= and rated|\"|<)", html),
"reviews": reviews,
"next_page": f"https://www.tripadvisor.com{unescape(next_page.group(1))}" if next_page else None,
}, indent=2, ensure_ascii=False))GOLOGIN_SCRAPING_API_KEY=your_key node every-review.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
let address = 'https://www.tripadvisor.com/Restaurant_Review-g60763-d33984348-Reviews-Olio_e_Piu-New_York_City_New_York.html';
const scrape = async (url) => {
for (let attempt = 0; attempt < 3; attempt += 1) {
const params = new URLSearchParams({ url: attempt ? `${url}?_r=${Date.now()}` : url, 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 html = (await response.json()).data?.html ?? '';
if (html.includes('ShowUserReviews-')) return html;
}
return '';
};
const text = (markup) =>
markup
.replace(/<[^>]+>/g, ' ')
.replace(/&/g, '&')
.replace(/'|'/g, "'")
.replace(/"/g, '"')
.replace(/\s+/g, ' ')
.trim();
const reviews = new Map();
let pages = 0;
while (address) {
const html = await scrape(address);
pages += 1;
for (const card of html.split(/data-test-target="HR_CC_CARD"|data-automation="reviewCard"/).slice(1)) {
const id = card.match(/ShowUserReviews-g\d+-d\d+-r(\d+)/)?.[1];
if (!id) continue;
const at = card.indexOf('data-test-target="review-body"');
const body = at >= 0 ? card.slice(at) : card.slice(card.indexOf('</h3>'));
reviews.set(id, {
id,
rating: card.match(/<title[^>]*>([\d.]+) of 5 bubbles<\/title>/)?.[1],
title: text(card.match(/<a[^>]+ShowUserReviews[^>]+>([\s\S]*?)<\/a>/)?.[1] ?? ''),
written: card.match(/Written (?:<!-- -->)?([^<]+)</)?.[1] ?? '',
text: text(body.slice(body.indexOf('>') + 1).split(/<button|Date of stay:|<div[^>]*>Written /)[0]),
});
}
const next = html.match(/aria-label="Next page" href="([^"]+)"/)?.[1];
address = next ? `https://www.tripadvisor.com${next.replace(/&/g, '&')}` : null;
}
const csv = (value) => `"${String(value).replace(/"/g, '""')}"`;
const rows = [...reviews.values()].map((r) => [r.id, r.rating, r.written, r.title, r.text].map(csv).join(','));
writeFileSync('reviews.csv', ['id,rating,written,title,text', ...rows].join('\n'));
console.log(`${reviews.size} reviews from ${pages} pages saved to reviews.csv`);GOLOGIN_SCRAPING_API_KEY=your_key node city-hotels.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst address = 'https://www.tripadvisor.com/Hotels-g60745-Boston_Massachusetts-Hotels.html';
const params = new URLSearchParams({ url: address, 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 html = (await response.json()).data?.html ?? '';
const hotels = [];
for (const [, json] of html.matchAll(/<script[^>]*application\/ld\+json[^>]*>([\s\S]*?)<\/script>/g)) {
const data = JSON.parse(json);
if (data['@type'] !== 'ItemList') continue;
for (const { item } of data.itemListElement) {
hotels.push({
name: item.name,
rating: item.aggregateRating?.ratingValue,
reviews: item.aggregateRating?.reviewCount,
phone: item.telephone,
address: item.address?.streetAddress,
page: item.url.replace(/\?.*$/, '').replace('/HotelHighlight-', '/Hotel_Review-'),
});
}
}
console.table(hotels.map(({ name, rating, reviews, phone }) => ({ name, rating, reviews, phone })));
console.log(`${hotels.length} hotels, each with its page for the reviews`);还需要同一批地点在 Google 上的数据?Google 评论爬虫以同样的方式返回地点的 Google 评分、星级分布和热门评论。
2026 年 8 月 31 日取代 Content API 的官方 API、Apify 上使用最多的评论采集工具、Outscraper 和 Web Unlocker:采集 Tripadvisor 数据时各自按什么计费,以及允许您保留什么。
| 需要什么 | Tripadvisor API | Apify | Outscraper | |
|---|---|---|---|---|
| 您按什么付费 | 一页 | 每个地点、每次调用 | 每条评论 | 每条评论 |
| 1,000 个含首批评论的地点 | $0.98 | $15 | $19 | $38 |
| 一个地点的全部评论 | 是,逐页读取 | 由合同设定的评论池 | 是 | 是 |
| 存储采集的数据 | 是 | 仅限位置 ID | 是 | 是 |
| 免费开始 | 1,000 个页面 | 1,000 次调用,仅一次 | 每月 $5 | 500 条评论 |
| 任何其他站点价格相同 | 是 | 否 | 否 | 否 |
| 整个页面的 HTML 或 Markdown | 是 | 否 | 否 | 否 |
需要先找到这些地点?Tripadvisor 城市列表每页包含 30 家酒店或餐厅,上面的“城市酒店”标签页就会读取它。Web Unlocker 以同样的方式返回任何其他站点。
一个账户,一个代理网络,一套生态。按任务需要选择产品。
还要在其他地方采集评论?请查看 Google 评论和 Google Maps 采集工具,或全部网页采集工具。
把地点的 Tripadvisor 地址发送给 Web Unlocker。它会用真实浏览器打开页面,并连同评分、城市排名、评分分布和评论一起返回:酒店页面 10 条,餐厅页面 15 条,每条都有作者、评分、标题、正文、日期和业主回复。每一页都链接到下一页,上面的代码会顺着这个链接一直读到最后一页。
用 requests 库把页面地址发送给 Web Unlocker,再从页面中读取各个字段。上面的 Python 标签页是一份完整的脚本,已在真实 API 上测试过。
Tripadvisor 已于 2026 年 8 月 31 日关闭 Content API,其密钥随之失效。替代产品 Tripadvisor Terra 出售自助套餐,评论数量有限,来自您的合同所设定的评论池,且其条款只允许您存储位置 ID。Web Unlocker 返回公开页面本身,逐页获取每一条评论。
Tripadvisor Terra 每个账户一次性免费提供前 1,000 次计费调用,之后每次调用按每个地点 $0.015 计费,用量越大单价越低。Web Unlocker 每 1,000 个页面 $0.98,一个酒店页面包含 10 条评论。
只在开始时免费:Tripadvisor Terra 给每个账户一次性的前 1,000 次计费调用,之后每次调用都要付费。带有每月免费调用额度的旧 Content API 已于 2026 年 8 月 31 日关闭。Web Unlocker 附带 1,000 次免费请求,相当于 10,000 条酒店评论。
旧 Content API 的密钥已于 2026 年 8 月 31 日失效;新密钥随 Tripadvisor Terra 套餐提供。Web Unlocker 密钥通过上面的表单在一个工作日内发放,并附带免费请求,可在您自己的地点上测试。
能,而且 Tripadvisor 评论爬虫无需登录即可做到:Tripadvisor 向每位访客逐页列出每一条评论。波士顿的 The Godfrey Hotel 在 926 页上显示 9,260 条英文评论,最后一页可追溯到 2016 年 1 月。全部评论合计 $0.91。
酒店或景点页面 10 条,餐厅页面 15 条,另外还有地点的评分、评论数、城市排名、评分分布以及住宿各方面的得分。
会,只要该地点回复过:回复人、日期和完整正文。在 The Godfrey Hotel 评论的第二页上,10 条评论全部有回复。
能。城市列表页包含 30 个地点,带有评分、评论数、价格等级、电话、地址和地图位置,每个地点的评论再多一页。上面的“城市酒店”标签页用一个页面列出波士顿的 30 家酒店。
Tripadvisor.com 列出的是英文评论。每个国家站点列出用本国语言写的评论:在 tripadvisor.fr 上,The Godfrey Hotel 有 2,061 条。Web Unlocker 以同样的方式返回这些页面,覆盖 195+ 个国家和地区。
上面的“每一条评论”标签页会写出 reviews.csv:每条评论一行,带有评分、日期、标题和正文。或者用 Gologin scraping skill 把页面交给 Claude,让它输出 CSV。
每 1,000 个页面低于 $1,每个页面价格相同:10,000 条酒店评论只需 $0.98。页面加载失败不收费。套餐每月 $49 起,含 50,000 次请求。
有,可以免费开始:Web Unlocker 附带 1,000 次免费请求,足够采集 10,000 条酒店评论。
不需要。Web Unlocker 会为您选择 IP,覆盖 195+ 个国家和地区,并从您选择的国家打开页面。
这取决于您的需求。Apify、Bright Data 和 Outscraper 出售整理好的现成数据行,并按每条评论计费。Web Unlocker 是一个以每页一个价格返回整个页面的 Tripadvisor 爬虫,带有排名、评分分布和业主回复,解析方式由您决定。
调用网站内部数据接口的爬虫,每当 Tripadvisor 改动其中一个接口就需要修复:Apify 上使用最多的 Tripadvisor actor 在 2026 年 10 月记录了三次这样的修复。Web Unlocker 返回的是访客看到的页面。
Tripadvisor 页面是公开的,无需登录即可加载。Web Unlocker 像访客的浏览器一样加载它并返回页面。您采集什么、如何使用,由您自己决定,请对照适用于您项目的规则自行核对。
简单介绍一下您的团队,即可获得: