关于 vrbo
vrbo 是用于搜索 VRBO 整套住宅、公寓和小木屋的命令行技能,可按目的地、日期和旅客信息查询价格及预订链接。它使用 Patchright 应对 VRBO 的浏览器验证,但不代办预订。
主要功能
- 01搜索整套房源
- 02按日期、人数、宠物和卧室筛选
- 03返回价格与预订链接
- 04以 JSON 输出房源结果
- 05重试浏览器验证请求
适用场景
- 01为家庭旅行寻找整套住宅
- 02比较 Airbnb 与 VRBO 房源
- 03搜索度假区或山区的多卧室房源
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ borski/ travel-hacking-toolkit --skill vrbo安装后在 Claude Code 中输入/vrbo确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
Dockerfilescripts/entrypoint.shsearch_vrbo.pytests/test_search_vrbo.py详细介绍
VRBO 搜索
通过 Patchright 搜索 VRBO 度假租赁房源,并返回整套住宅、公寓或木屋房源及其价格和预订链接。对于团体和家庭出行,VRBO 是 Airbnb MCP 的天然补充——许多山地小镇和度假区的物业管理方会同时在两个平台发布房源,但 VRBO 上有一些由专业团队管理的公寓和木屋,这些房源不一定会出现在 Airbnb 上。
需要 Patchright(一个可绕过检测的 Playwright 分支)。VRBO 有 Akamai Bot Manager 保护——普通 HTTP、标准 Playwright、@playwright/mcp 和 agent-browser 都会遇到返回 429 Too Many Requests(“Provisioned request rate has been exceeded”)的机器人拦截页。Patchright 可以通过 Akamai 传感器检测并获取 _abck Cookie。这与 chase-travel / amex-travel / southwest 技能遇到的是同一道拦截,解决方法也相同。
必须以有头模式运行(headless=False)。 Akamai 会标记无头浏览器。在 macOS 上会短暂出现一个 Chrome 窗口。对于后台运行或无人值守运行,请使用 Docker(Xvfb 会提供虚拟显示器)。
无需登录。 VRBO 搜索结果是公开的——与 chase-travel / amex-travel 不同,这里不需要凭据。持久化配置文件仅缓存 Akamai Cookie,以减少重复搜索时再次触发验证的情况。
前置条件
pip install patchright && patchright install chromium
也可以使用 Docker(无需本地安装,通过 Xvfb 以有头模式运行):
docker build -t vrbo skills/vrbo/
适用场景
- 团体或家庭出行,需要整套住宅、公寓或木屋
- “比较 的 Airbnb 和 VRBO”
- 多卧室租赁房源,带有独立房间(适合多人出行)
- 度假区或山地小镇(Canmore、Banff 周边、Whistler、Muskoka),这些地方的专业物业管理方会在 VRBO 上发布 Airbnb 上没有的公寓房源
不适用场景
- 完成预订。 此技能只会查找租赁房源并返回链接。不要尝试完成购买。
- 酒店。 使用 compare-hotels / serpapi / liteapi / 门户技能。
- 单人间或合住房间。 VRBO 只提供整套房源;如需预订合住房屋中的独立房间,请使用 Airbnb MCP(
private_room)。
用法
# Local (pops up a Chrome window on macOS)
python3 skills/vrbo/scripts/search_vrbo.py \
--dest "Canmore, Alberta, Canada" \
--checkin 2026-06-26 --checkout 2026-07-02 --adults 3 --json
# Whole homes with 3+ bedrooms
python3 skills/vrbo/scripts/search_vrbo.py \
--dest "Canmore, Alberta" --checkin 2026-06-26 --checkout 2026-07-02 \
--adults 3 --min-bedrooms 3 --json
# Docker (headless host, headed browser via Xvfb)
docker run --rm vrbo \
--dest "Canmore, Alberta" --checkin 2026-06-26 --checkout 2026-07-02 \
--adults 3 --json
参数
| 标志 | 默认值 | 说明 |
|---|---|---|
--dest | 必填 | 目的地关键词,例如 "Canmore, Alberta, Canada"。VRBO 会在服务端将其解析为 regionId。 |
--checkin / --checkout | 必填 | ISO YYYY-MM-DD。必须为今天或之后的日期。 |
--adults | 2 | 旅客人数。 |
--children | 0 | |
--pets | 关闭 | 仅限允许宠物的房源。 |
--min-bedrooms | 0 | 客户端筛选条件(VRBO 的 URL 筛选不可靠)。 |
--limit | 20 | 返回的房源数量上限。 |
--retries | 4 | Akamai 重试次数(预热首页 → SERP)。 |
--json | 关闭 | 将 JSON 输出到 stdout(编排时请使用此选项)。 |
输出
JSON 结构(使用 --json 时):
{
"source": "vrbo",
"extractor": "__PLUS_REDUX_STORE__ | dom:lodging-card | dom:anchors",
"searchUrl": "https://www.vrbo.com/search?...",
"count": 12,
"listings": [
{
"id": "1234567",
"name": "Mountain-View Condo Steps from Main St",
"bedrooms": 3, "bathrooms": 2, "sleeps": 6,
"rating": 4.9, "reviewCount": 84,
"priceText": "The current price is CA $312 CA $312 CA $2,184 total includes taxes & fees",
"pricePerNight": 312, "priceTotal": 2184, "priceIncludesTaxes": true,
"lat": 51.08, "lng": -115.35,
"url": "https://www.vrbo.com/en-ca/cottage-rental/p1234567?..."
}
]
}
extractor 会告诉你数据由哪一层提取。__PLUS_REDUX_STORE__ 数据最丰富(卧室数、坐标、评价数量);dom:lodging-card 更可靠但信息较少(常见情况——名称、价格、URL);dom:anchors 是最后手段,仅抓取 ID 和 URL——如果看到这种结果,说明页面结构已更改,需要更新选择器(提交一个 P2 任务)。
价格: SERP 上的价格字符串会解析为 pricePerNight 和 priceTotal。经实时数据验证:VRBO 的 SERP 总价包含税费(priceIncludesTaxes: true)——priceTotal 是整个住宿期间的全包价格,pricePerNight 是显示的每晚价格。这直接满足酒店比较标准的全包价格要求;不过预订前仍应打开房源 URL 确认,因为损坏押金或可选附加项目可能未计入 SERP 显示的价格。
测试
纯逻辑(搜索 URL 构建、Akamai 拦截/挑战检测、SERP 价格解析、骨架筛选、房源信息补充)由标准库 unittest 测试覆盖——无需浏览器、网络或 Patchright(patchright 导入是延迟执行的):
python3 -m unittest discover -s skills/vrbo/tests -v # or: python3 -m pytest skills/vrbo/tests
共 17 个测试,无第三方依赖。浏览器驱动的流程(绕过 Akamai、提取 DOM)无法在没有实时住宅网络连接的情况下进行单元测试——请使用真实搜索手动验证(参见上文的用法)。代码仓库的冒烟测试(scripts/smoke-test.sh)会单独验证此技能的 frontmatter 和结构。
已知的不稳定因素
- Akamai 会基于 IP 限速。 即使使用 Patchright,数据中心 / CI / VPN 的 IP 也经常会被拦截。使用住宅网络连接可获得最佳效果。如果每次重试都返回 429,脚本会以清晰的消息退出,状态码为 1——这是环境拦截,不是代码错误。实际使用中,家庭 / 移动网络 / 酒店 Wi-Fi 的 IP 可以通过拦截,但从同一 IP 快速重复搜索可能会开始返回 429——请将搜索间隔几分钟,不要在紧凑的批次中循环执行。
- DOM 选择器会发生变化。 VRBO/Expedia 会定期修改其
data-stid设计系统。提取器会先尝试嵌入式状态数据块(最稳定),再尝试data-stid卡片,最后尝试通用锚点抓取。如果extractor为dom:anchors,请更新 Layer-1/2 选择器。