scrape hotel listings

抓取酒店房源的关键,在于应对规模和地理位置带来的影响。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 是否遵守约定价格,或是否以更低价格削弱直接预订渠道。
  • 竞争对手定价:收益经理会追踪附近物业对相同日期和房型的定价,然后调整自己的价格。
  • 市场调研:分析师会研究入住率信号、季节性、设施趋势以及进入某个目的地的新增供给。

无论哪种场景,数据价值都取决于能否如实采集目标市场中真实旅行者看到的价格,这也正是基础设施选择至关重要的原因。

为什么地理定向会改变酒店价格?

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 美元。创建账户,立即运行你的首个酒店房源采集任务。


Share article: