In this Article
抓取酒店房源的关键,在于应对规模和地理位置带来的影响。Booking 和 Expedia 等大型在线旅行社 (OTA) 会根据用户所在国家、使用的货币、设备和会话显示不同价格,因此简单的抓取程序得到的价格往往不一致,甚至完全错误。
本文介绍实用要点:哪些应用场景值得投入,为什么按地区定向的代理和粘性会话很重要,如何优先读取 JSON 端点而非脆弱的 HTML,以及日期范围和入住人数参数如何让请求量和带宽需求急剧增加。两个简短的 Python 示例展示了请求和解析的常用方式。
DataImpulse 是一家合乎道德的代理服务商,在 195 个国家/地区提供超过 9,000 万个住宅、移动和数据中心 IP 地址。它采用从每 GB 1 美元起的按量付费模式,流量永不过期,广泛用于网络抓取、广告核验、价格监控、市场调研和多账户管理。
关键要点
- 地理位置很关键:酒店的价格和可订状态会因国家和货币而异,因此要准确抓取酒店房源,需要与各个定价市场相匹配的、按国家定向的住宅代理。
- 最佳代理类型:使用真实用户 IP 的轮换住宅代理,更容易通过检测。
- 价格:每 GB 低至 1 美元,按量付费,流量永不过期,无需订阅。
- 覆盖范围:遍及 195 个国家/地区的 9,000 万以上合乎道德来源的 IP。
- 可靠性:成功率 99.51%,在 G2 上获评 4.8 分(满分 5 分)。
- 协议与定向:支持 HTTP、HTTPS 和 SOCKS5,并包含按国家定向。

为什么要抓取酒店房源?
酒店房源数据为整个旅游行业的价格情报、市场调研和价格一致性监控提供支撑。团队收集这些数据,是为了回答静态报表无法解答的问题。
- 价格一致性监控:酒店和连锁集团会检查 OTA 是否遵守约定价格,或是否以更低价格削弱直接预订渠道。
- 竞争对手定价:收益经理会追踪附近物业对相同日期和房型的定价,然后调整自己的价格。
- 市场调研:分析师会研究入住率信号、季节性、设施趋势以及进入某个目的地的新增供给。
无论哪种场景,数据价值都取决于能否如实采集目标市场中真实旅行者看到的价格,这也正是基础设施选择至关重要的原因。
为什么地理定向会改变酒店价格?
OTA 采用动态定价,因此同一房型、同一日期的价格会因访客的国家、货币,甚至设备或会话而不同。来自德国的请求可能显示欧元价格和地区专属促销,而来自美国的请求则可能完全看不到这些内容。
要采集准确的数据,你需要一个位于所研究市场的 IP。按国家定向能让你以本地访客的身份查看相应货币和促销价格。住宅代理通常是首选,因为其地址来自真实用户的网络连接,OTA 更可能将其视为普通旅行者,而不是自动化流量。数据中心代理速度更快、成本更低,但更容易被强大的反爬系统标记,因此更适合低敏感度的目标或首轮采集,而不适合受保护的 OTA 页面。
粘性会话如何帮助多页面流程?
粘性会话会在一连串请求中保持同一个 IP 地址。对于类似预订的流程,这一点很重要,因为状态会在页面之间延续。搜索结果页、房间详情页和价格确认步骤通常会共享与源 IP 绑定的 Cookie 和服务器端会话令牌。
如果 IP 在流程中途轮换,网站可能会重置会话、显示不同的货币或触发验证挑战。为每次完整搜索(一个酒店、一个日期范围和一组入住人数)分配一个粘性会话,完成所需页面后再释放。对于每次请求只抓取一张房源卡片的大范围单页采集,使用轮换会话;对于类似结账的多步骤流程,则保持粘性会话。DataImpulse 在同一个 IP 池上同时支持轮换会话和粘性会话。
应该抓取 HTML 还是 JSON 端点?
只要存在底层的 JSON 端点,就优先使用它们。大多数现代 OTA 通过后台 XHR 或 fetch 请求加载价格,并返回结构清晰的 JSON;用户看到的 HTML 则由 JavaScript 后续渲染,布局也经常变化。
打开浏览器开发者工具,在搜索过程中查看 Network 面板,找出返回可订状态和价格数据的 XHR 请求。直接重放这些端点比从 HTML 解析房源卡片更快、占用带宽更少,也稳定得多。当只有 HTML 可用时,应瞄准稳定的属性,而不是用于外观的类名。无论采用哪条路线,这份关于抓取时避免被封的指南中的一般防御技巧依然适用;如果你专注于某一个 OTA,我们关于如何抓取 Booking.com的详细教程会更深入地讲解单个网站。
如何规划请求量和带宽?
在开始之前先估算你的请求数量,因为日期范围和入住人数参数会迅速叠加。每家酒店、每个入住日期、每种入住晚数和入住人数配置都是独立查询,因此一个规模不大的搜索网格就可能产生数十万次请求。
例如,500 家酒店乘以 90 个入住日期、3 种入住晚数和 2 种入住人数选项,一次执行就是 270,000 次请求。代理套餐通常按 GB 计费,因此应尽量减小每个响应:访问 JSON 端点而非完整 HTML 页面,只请求所需字段,并避免下载图片或地图瓦片。下面的 Python 代码片段展示了如何构建日期网格,以便你在运行前估算这项任务的规模。
import requests
from datetime import date, timedelta
proxies = {
"http": "http://USER:[email protected]:823",
"https": "http://USER:[email protected]:823",
}
start = date(2026, 8, 1)
dates = [start + timedelta(days=i) for i in range(90)]
stays = [1, 3, 7]
for check_in in dates:
for nights in stays:
params = {
"hotel_id": 123456,
"checkin": check_in.isoformat(),
"checkout": (check_in + timedelta(days=nights)).isoformat(),
"adults": 2,
"currency": "EUR",
}
r = requests.get(
"https://example-ota.com/api/availability",
params=params,
proxies=proxies,
timeout=20,
)
# store r.json() keyed by hotel_id, checkin, nights
如何解析酒店房源卡片?
当你不得不读取 HTML 时,通过定位一个稳定的容器,并从中提取名称、价格和评分来解析每张房源卡片。逐张卡片处理,这样单个字段发生变化也不会导致整个任务失败。
下面的示例使用 BeautifulSoup 遍历结果卡片。请根据你的目标调整选择器,并始终对缺失字段做好防护,因为售罄的房间和促销版式常常会省略价格或评分。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
listings = []
for card in soup.select("div[data-testid='property-card']"):
name = card.select_one("h3")
price = card.select_one("span[data-testid='price']")
rating = card.select_one("div[data-testid='rating']")
listings.append({
"name": name.get_text(strip=True) if name else None,
"price": price.get_text(strip=True) if price else None,
"rating": rating.get_text(strip=True) if rating else None,
})
print(len(listings), "cards parsed")
如何应对 OTA 的反爬防御?
应假定 OTA 的反爬保护很强,并据此设计抓取流程。大型旅游网站会使用指纹识别、限速、行为检测和 IP 信誉评分,因此若从少数几个地址发起高频抓取,很快就会被发现。
- 将请求分散到一个大型住宅 IP 池中,使任何单个 IP 都不会呈现出不自然的请求频率。
- 将请求速率控制在接近人工操作的节奏,并在请求之间加入随机延迟,而非使用固定间隔。
- 让货币、语言和 Accept 请求头与出口 IP 所在国家保持一致。
- 对于防护最严密的页面,可以考虑移动代理,因为运营商级 NAT 地址由许多真实用户共享,很难被彻底封禁。
DataImpulse 通过向自愿参与并获得报酬的用户获取 IP,以合乎道德的方式构建 IP 池,并符合 GDPR 要求,同时提供可靠采集酒店数据所需的地理覆盖。
适用于旅游网站的代理类型
| 代理类型 | 最适合 | 备注 |
|---|---|---|
| 住宅轮换 | 大规模价格抓取 | 每次请求更换新 IP |
| 住宅粘性 | 多步骤预订流程 | 保持会话稳定 |
| 移动 | 难以访问的网站 | 信任度最高,价格更高 |
| 数据中心 | 快速批量查询 | 更容易被封禁 |

常见问题
抓取酒店房源合法吗?
在许多司法管辖区,抓取公开可获取的房源数据通常是允许的,但网站的服务条款、当地法律以及有关个人数据或受版权保护数据的规则仍然适用。在大规模采集之前,请查看目标网站的条款并咨询法律顾问。
抓取酒店价格最适合用哪种代理类型?
按国家定向的住宅代理通常是首选,因为 OTA 的价格因市场而异,而住宅 IP 会呈现为真实的本地旅行者。移动代理在防护最严密的页面上有帮助,数据中心代理则适合低敏感度或首轮采集。
为什么我获取到的价格与网站显示的不同?
酒店价格取决于访客的国家、货币、会话,有时还取决于设备,因此与你所研究市场不匹配的 IP 或货币会返回不同的数字。请让出口 IP 所在的国家和货币与目标市场保持一致。
抓取酒店数据会消耗多少带宽?
这取决于请求量,而请求量会随着日期和入住人数网格迅速增长。访问 JSON 端点并只请求所需字段可以让每个响应保持较小,因此在开始大规模运行之前,请先估算网格规模和每个响应的大小。
我应该抓取 HTML 页面还是 API 端点?
优先使用 OTA 在后台调用的 JSON 端点,因为它们比 JavaScript 渲染的 HTML 更轻量、更快、更稳定。只有在没有暴露合适端点时,才退而解析房源卡片。
什么情况下 DataImpulse 并不适合?
如果你需要静态 ISP 代理、完全托管的抓取 API,或访问银行和政府网站,那么 DataImpulse 并不合适。它专注于用于采集公开数据和访问内容的轮换住宅、移动和数据中心代理。
开始采集准确的酒店数据
如果你需要采集 OTA 和酒店网站中按国家显示的准确价格,DataImpulse 在 195 个国家/地区提供合乎道德来源的住宅、移动和数据中心 IP,支持轮换和粘性会话,价格低至每 GB 1 美元。创建账户,立即运行你的首个酒店房源采集任务。
