mcpField
V
vrbo

vrbo

github.com/borski其他78043 次安装2 天前更新
代码仓库

关于 vrbo

vrbo 是用于搜索 VRBO 整套住宅、公寓和小木屋的命令行技能,可按目的地、日期和旅客信息查询价格及预订链接。它使用 Patchright 应对 VRBO 的浏览器验证,但不代办预订。

主要功能

  1. 01搜索整套房源
  2. 02按日期、人数、宠物和卧室筛选
  3. 03返回价格与预订链接
  4. 04以 JSON 输出房源结果
  5. 05重试浏览器验证请求

适用场景

  1. 01为家庭旅行寻找整套住宅
  2. 02比较 Airbnb 与 VRBO 房源
  3. 03搜索度假区或山区的多卧室房源

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/borski/travel-hacking-toolkit --skill vrbo

安装后在 Claude Code 中输入/vrbo确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

Dockerfile
scripts/
entrypoint.sh
search_vrbo.py
tests/
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。必须为今天或之后的日期。
--adults2旅客人数。
--children0
--pets关闭仅限允许宠物的房源。
--min-bedrooms0客户端筛选条件(VRBO 的 URL 筛选不可靠)。
--limit20返回的房源数量上限。
--retries4Akamai 重试次数(预热首页 → 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 选择器。

评论

支持 Markdown