vrbo について
vrbo は、目的地や日程、宿泊人数を指定してVRBOの一棟貸し、コンドミニアム、キャビンを検索するコマンドラインスキルです。Patchrightでブラウザー検証に対応し、価格と予約リンクを返しますが、予約手続きは行いません。
主な機能
- 01一棟貸しの検索
- 02日程・人数・ペット・寝室数での絞り込み
- 03価格と予約リンクの取得
- 04検索結果のJSON出力
- 05ブラウザー検証リクエストの再試行
活用シーン
- 01家族旅行向けの一棟貸し探し
- 02Airbnbと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)。Airbnb にはないコンドミニアムを、専門の物件管理会社が VRBO に掲載している地域
使用しない場面
- 予約の完了。 このスキルはレンタル物件を探してリンクを返すだけです。購入を完了しようとしないでください。
- ホテル。 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 を標準出力に出力します(オーケストレーションにはこちらを使用してください)。 |
出力
--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 は先頭に表示される1泊あたりの料金です。これにより、ホテル比較基準の税込み総額要件をそのまま満たします。なお、損害補償金や任意の追加料金が SERP の金額に含まれていない場合があるため、予約前に掲載ページの URL を開いて確認してください。
テスト
純粋なロジック(検索 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)では、このスキルのフロントマターと構造を別途検証します。
既知の不安定要因
- Akamai は IP アドレスごとにレート制限されます。 Patchright を使用しても、データセンター/CI/VPN の IP アドレスは頻繁にブロックされます。最良の結果を得るには、住宅用回線で実行してください。再試行のたびに 429 が返される場合、スクリプトは明確なメッセージを出して 1 で終了します。これは環境によるブロックであり、コードのバグではありません。実際には、自宅/モバイル/ホテルの Wi-Fi の IP アドレスならブロックを回避できますが、同じ IP アドレスから短時間に繰り返し検索すると、429 が返され始めることがあります。検索の間隔を数分空け、短時間に連続して実行しないでください。
- DOM セレクターは変更されることがあります。 VRBO/Expedia は
data-stidデザインシステムを定期的に改訂しています。エクストラクターはまず埋め込み状態の Blob(最も安定)を試し、次にdata-stidカード、最後に汎用的なアンカーのスクレイピングを試します。extractorがdom:anchorsの場合は、Layer-1/2 セレクターを更新してください。