Airbnbの掲載情報や価格データは、ホストの価格設定、不動産投資の市場分析、競合調査などに利用できます。800万件超の物件が220以上の国に掲載されている一方、市場データを取得できる公開APIは用意されていません。そのため、価格インテリジェンス、競合ベンチマーク、研究用データセットを作成する際には、Webスクレイピングが選択肢になります。
ただし、Airbnbはスクレイピングの難易度が高いサイトです。Akamai Bot Managerをベースにした独自のWAFが使われ、ページはReactでクライアント側に描画されます。CSSクラス名も頻繁に変わるため、単純なHTTP取得や固定セレクタだけでは安定した運用が難しい場合があります。私自身、軽量なHTTPライブラリ、本格的なブラウザ自動化、AIを使うノーコードツールまで試してきましたが、用途を問わず使える単一の方法はありませんでした。
本ガイドでは、Airbnbデータを取得する5つの手法について、実行可能なコード、各手法のトレードオフ、アクセス制限に配慮した運用方法を整理します。Python開発者、データアナリスト、スプレッドシートで物件データを扱いたい不動産投資家が、目的と運用規模に合う方法を選べる構成です。
なぜAirbnbをスクレイピングするのか?現場で多いユースケース
Airbnbをスクレイピングする目的は、物件情報を業務や研究で利用できるデータに整えることです。代表的な6つの用途を整理します。
| ユースケース | 取得するデータ | 利用者 |
|---|---|---|
| ダイナミックプライシング戦略 | 特定半径内の競合の1泊料金 | ホスト、物件管理者 |
| 投資分析 | 稼働率の代替指標(レビュー頻度、カレンダーの空き状況)、ADR、RevPAR | 不動産投資家 |
| 清掃費のベンチマーク | 物件タイプ別の清掃費(米国主要都市では平均$81~$335) | ホスト、価格コンサルタント |
| レビュー感情分析 | NLP/感情スコアリング用のゲストレビュー | データサイエンティスト、ホスピタリティチーム |
| 学術研究 | 住宅政策、観光、都市経済向けの市場レベルデータセット | 研究者(1,021本のAirbnb関連学術論文の48.7%がスクレイピングデータを使用) |
| 競合追跡 | 新規掲載、価格変動、時間経過に伴う空室状況 | STR運営者、市場アナリスト |
価格監視や競合追跡など、継続的な変化を把握したい用途では、定期実行や自動スクレイピングが役立ちます。一度のスナップショットではなく、同じ条件で時系列データを蓄積することで、価格や空室状況の変化を比較できます。
短期賃貸(STR)の市場は、従来のホテルより速いペースで伸びています。2025年のSTR需要は6.0%増、いっぽうホテル需要は0.3%減でした。市場の変化を追ううえで、継続的に取得したデータは判断材料になります。
Airbnbのスクレイピングが難しい理由
実装に進む前に、Airbnbが5段階中4(難しい)と評価される理由を整理します。主な課題は3つあり、それぞれが同時に取得の安定性へ影響します。
Airbnbのボット対策
Airbnbでは、Akamai Bot Managerと独自WAFを組み合わせた企業向けのボット検知システムが使われ、1つのリクエストを複数のシグナルから評価します。単純なレート制限だけでなく、フィンガープリントやクライアント側の挙動も判定対象になります。

検知への影響が大きいとされる順に、主な層を整理します。
- TLSフィンガープリント(高): Pythonの
requestsライブラリは、一般的なブラウザと異なるTLSハンドシェイク署名を出すことがあります。AkamaiはJA3/JA4方式で、暗号スイート・拡張・ALPNの並び順まで読み取ります。素のrequestsだと保護サイトでの成功率は約12%ですが、ブラウザのTLSフィンガープリントを偽装するライブラリを使えば92%まで跳ね上がります。 - JavaScript実行(高): Akamaiはクライアント側にスクリプトを配り、デバイス属性・ハードウェア性能・OS情報といった「センサーデータ」を集めます。ここから
_abckCookieが作られます。JavaScriptを実行しないリクエストは、拒否される場合があります。 - ブラウザフィンガープリント(高): Canvas・WebGL・フォント解析も自動化の判定に使われます。ヘッドレスブラウザでは、
navigator.webdriverフラグ、欠けたプラグイン、整合しないハードウェア値などが検知要因になる場合があります。 - HTTPヘッダー解析(高):
Sec-Fetch-*ヘッダーが抜けていると、Airbnbで403を受けるありがちな引き金になります。 - IPレピュテーション(中): データセンターIPはブロック対象になりやすいため、処理規模や運用条件に応じてプロキシ構成を検討します。
- 行動分析(中): 一定すぎるリクエスト間隔や、通常の閲覧と異なる操作パターンも、自動化を示すシグナルになり得ます。
検知された場合は、403 Forbidden(フィンガープリント不一致)、429 Too Many Requests(レート制限)、503 Service Unavailable(Akamaiのチャレンジ)、またはCAPTCHAページが返ることがあります。
Airbnbの動的でJavaScript頼みのページ
Airbnbにrequests.get()を投げても、戻ってくるのは実データではなく、Reactの骨組みだけが入ったプレースホルダーHTMLです。ある開発者の言葉を借りれば、「素のHTTPリクエストではまるで歯が立たない。きちんとしたプロキシと本物のJavaScriptレンダリングがなければ、スクレイピングしているのはAirbnbではなく、プレースホルダーだ」というわけです。
実データは、内部のGraphQL API呼び出しを経由してクライアント側で読み込まれます(検索結果は/api/v3/StaysSearch、掲載詳細は/api/v3/PdpPlatformSections)。つまり、使えるデータの大半を取りにいくには、フルブラウザかAPIインターセプトが要るということです。
DOMが絶えず変わる
AirbnbはCSS-in-JSを採用していて、ハッシュ化されたクラス名がデプロイのたびに変わります。公開された例だと、_tyxjp1、lxq01kf、atm_mk_h2mmj6、t1jojoys、_8s3cttといった具合です。Automatio(2025)も「これらのクラスは安定性を意図して付けられたものではなく、見た目が何も変わらなくても、いつ書き換わってもおかしくない」と指摘しています。
この苦労は開発者コミュニティでもさんざん語り尽くされています。ScrapingBeeが言うように「CSSクラスは頻繁に変わるので、そこに依存するのはスクレイパーを壊す一番の近道」ですし、DEV Communityのベテラン開発者はこうまとめています。「50%遅くても絶対に壊れないスクレイパーのほうが、毎週壊れる高速なスクレイパーより、何倍も価値がある」。
業界の見立てでは、DOMの変化・フィンガープリント更新・エンドポイントのスロットリングが重なり、いまや毎週10~15%のクローラーが手直しを迫られているとされています。
どれを選ぶか:Airbnbをスクレイピングする5つの手段
実装前に、各手法の準備、速度、ボット対策への対応、保守負担、適した用途を比較します。すべての条件に適した単一の方法はないため、取得対象と運用規模を基準に選びます。
| 手法 | 準備の手間 | 速度 | ボット対策耐性 | 保守性 | 最適な用途 |
|---|---|---|---|---|---|
純HTTP(requests / pyairbnb) | 低 | 高速 | 中(API変更に弱い) | 中 | ちょっとした調査、小規模データセット |
| ブラウザ自動化(Selenium) | 高 | 遅い | 中 | 高(DOM崩れの影響を受けやすい) | 動的コンテンツ、日付依存の価格 |
| ブラウザ自動化(Playwright) | 中 | 中 | 中~高 | 中 | Seleniumの現代的な代替手段 |
| スクレイピングAPI(ScrapingBee、Bright Data) | 低 | 高速 | 高(プロキシローテーション内蔵) | 低 | 大規模スクレイピング、本番運用 |
| ノーコード(Thunderbit) | 低 | 高速 | 条件による(クラウド実行を利用) | 低(ページ変更時に再設定が必要な場合あり) | 非開発者、単発分析 |
以降ではPythonの各手法を順に実装し、最後にコードを書かずに取得するノーコード手法を説明します。
手順解説:RequestsでPythonからAirbnbをスクレイピングする(HTTP優先アプローチ)
最初に、ブラウザやchromedriverを使わない軽量な方法を説明します。準備は比較的簡単ですが、取得できるデータには制限があります。
Python環境の準備
プロジェクト用のフォルダを作り、仮想環境を整えます。
mkdir airbnb-scraper && cd airbnb-scraper
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install requests beautifulsoup4 pandas pyairbnb
pyairbnbは、Airbnb内部のStaysSearch GraphQL APIを横取りする軽量ライブラリです(GitHubスター139件、最終リリースは2026年2月)。HTMLには一切触れないので、CSSクラスの変更に振り回されにくいのが強みです。個人メンテナンスゆえの保守リスクはありますが、いまも活発に更新が続いています。
方法A:pyairbnbで検索結果を取得する
構造化されたAirbnbデータをPythonで取得する方法です。
import pyairbnb
import pandas as pd
# 場所と日付で検索
results = pyairbnb.search_all(
query="Austin, TX",
checkin="2025-08-01",
checkout="2025-08-03",
adults=2,
currency="USD"
)
# DataFrameに変換
df = pd.DataFrame(results)
print(df[['name', 'price', 'rating', 'reviewsCount', 'url']].head())
df.to_csv("airbnb_austin.csv", index=False)
pyairbnbはget_details()、get_price()、get_reviews()、get_calendar()、get_listings_from_user()にも対応しています。どの関数も、ローテーション用のプロキシURL引数を受け取れます。
方法B:BeautifulSoupで手動HTTPリクエストを送る
サードパーティライブラリに頼りたくないなら、自分でリクエストを組むこともできます。ただし注意点として、素のrequestsはTLSフィンガープリントのせいでかなり早い段階で弾かれます。ブラウザのTLSフィンガープリントを偽装するcurl_cffiに切り替えると、成功率が大きく上がります。
from curl_cffi import requests as cffi_requests
from bs4 import BeautifulSoup
import json
url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
}
response = cffi_requests.get(url, headers=headers, impersonate="chrome131")
soup = BeautifulSoup(response.text, "html.parser")
schema.orgのマイクロデータから抜き出す
Airbnbは、schema.orgのマイクロデータをHTMLマークアップに直接埋め込んでいます。こうした意味タグは、CSSクラスセレクタよりもずっと安定しています。itemprop="itemListElement"を持つコンテナを探しましょう。
listings = soup.find_all("div", itemprop="itemListElement")
data = []
for listing in listings:
name_tag = listing.find("meta", itemprop="name")
url_tag = listing.find("meta", itemprop="url")
position_tag = listing.find("meta", itemprop="position")
data.append({
"name": name_tag["content"] if name_tag else None,
"url": url_tag["content"] if url_tag else None,
"position": position_tag["content"] if position_tag else None,
})
df = pd.DataFrame(data)
df.to_csv("airbnb_listings.csv", index=False)
ただし限界もあります。schema.orgタグで拾えるのは掲載名・URL・順位までで、価格・評価・アメニティは含まれません。もっと中身の濃いデータが欲しいなら、ブラウザ自動化かAPIインターセプトに進む必要があります。
手順解説:SeleniumまたはPlaywrightでPythonからAirbnbをスクレイピングする
日付で変わる価格、[もっと見る]の奥に隠れたアメニティ、レビュー全文などの動的コンテンツを取得する場合は、ブラウザ自動化を使います。
ブラウザ自動化が向いている場面
- 実際の価格を出すために日付選択が必要なページ
- インタラクティブ要素の裏に畳まれたアメニティやレビュー
- JavaScript実行後にしか現れないデータ
- スクロールやクリックなど、ページ操作が前提になる場合
SeleniumとPlaywrightの選び方
最新のWebアプリへの対応、非同期処理、ブラウザバイナリの管理を重視する場合は、Playwrightが第一候補になります。一方、SeleniumではChromeDriverのバージョン不整合——Chromeの更新にChromeDriverが追いつかない問題——への対応が必要になる場合があります。
Seleniumには、チュートリアルやStackOverflowの回答が多く、既存の実装資産を利用しやすいという強みがあります。チームの経験、既存コード、必要なブラウザ対応を基準に選ぶとよいでしょう。
Playwrightのセットアップ
pip install playwright playwright-stealth
playwright install chromium
Airbnbへ移動して掲載物件を取り出す
import asyncio
from playwright.async_api import async_playwright
from playwright_stealth import stealth_async
import json
async def scrape_airbnb():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False) # headless=True のほうがリスク高め
context = await browser.new_context(
viewport={"width": 1920, "height": 1080},
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
)
page = await context.new_page()
await stealth_async(page)
url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
await page.goto(url, wait_until="networkidle")
# クラス名より安定しやすい data-testid を使って掲載カードを待つ
await page.wait_for_selector('[data-testid="card-container"]', timeout=15000)
# 掲載データを抽出
listings = await page.query_selector_all('[data-testid="card-container"]')
results = []
for listing in listings:
title_el = await listing.query_selector('[data-testid="listing-card-title"]')
subtitle_el = await listing.query_selector('[data-testid="listing-card-subtitle"]')
title = await title_el.inner_text() if title_el else None
subtitle = await subtitle_el.inner_text() if subtitle_el else None
results.append({"title": title, "subtitle": subtitle})
await browser.close()
return results
data = asyncio.run(scrape_airbnb())
GraphQL APIをインターセプトする(DOM解析を避ける方法)
変化しやすいDOM要素を直接解析せず、Airbnbの内部APIレスポンスを取得する方法です。レスポンスは構造化されたJSONとして扱えます。
api_responses = []
async def handle_response(response):
if "StaysSearch" in response.url:
try:
data = await response.json()
api_responses.append(data)
except:
pass
page.on("response", handle_response)
await page.goto(url, wait_until="networkidle")
# APIレスポンスを解析
if api_responses:
search_results = api_responses[0]["data"]["presentation"]["staysSearch"]["results"]["searchResults"]
for result in search_results:
listing = result.get("listing", {})
pricing = result.get("pricingQuote", {})
print(f"{listing.get('name')} — {pricing.get('price', {}).get('total')}")
StaysSearchのレスポンスには、id、name、roomTypeCategory、bedrooms、bathrooms、personCapacity、avgRating、reviewsCount、isSuperhost、それに細かな価格内訳まで入っています。Airbnbのフロントエンドがページ描画に使っているのと、まったく同じデータです。
ページネーションをさばく
Airbnbは1ページにおよそ18件の掲載を出し、items_offsetというURLパラメータで送ります。上限はだいたい17ページ(検索1回あたり約300件)です。
import time
import random
base_url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
all_results = []
for page_num in range(17): # 最大およそ17ページ
offset = page_num * 18
paginated_url = f"{base_url}&items_offset={offset}"
# ... ここで前述のように移動してスクレイピング ...
time.sleep(random.uniform(3, 7)) # ページ間にランダム遅延
PythonでAirbnbの日付依存価格をスクレイピングする方法
価格分析で重要となる、チェックイン日とチェックアウト日によって変わる価格の取得方法を説明します。
日付なしではAirbnbの価格が出てこない理由
ざっと90%のケースで、Airbnbは価格を見せる前にチェックイン/チェックアウト日を求めてきます。日付がないと、ぼんやりした「1泊あたりの価格」レンジしか出ず、ときには価格そのものが表示されません。ScrapingBeeも「掲載が価格を出さない場合(たとえばAirbnbが日付や人数の調整を促している場合)、関数はただNoneを返す」と書いています。
2025年4月から、Airbnbは世界中のすべてのゲスト向けに、税抜き前の全手数料込みの総額を標準表示するようになりました。以前は「合計価格を表示」のトグルがあり、約1,700万人のゲストが利用していましたが、現在は総額表示がデフォルトです。
URLパラメータで日付を渡す
価格データを取得する場合は、検索URLにcheckinとcheckoutを含めます。
https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2
日付を指定すると、ページ表示とAPIレスポンスから、対象期間の1泊料金と合計料金を取得できる場合があります。
価格分析のために日付範囲を回す
季節ごとの価格データが要るホストや投資家には、次のようなやり方が向いています。
from datetime import datetime, timedelta
start_date = datetime(2025, 7, 1)
end_date = datetime(2025, 12, 31)
stay_length = 2 # 泊数
current = start_date
date_ranges = []
while current + timedelta(days=stay_length) <= end_date:
checkin = current.strftime("%Y-%m-%d")
checkout = (current + timedelta(days=stay_length)).strftime("%Y-%m-%d")
date_ranges.append((checkin, checkout))
current += timedelta(days=7) # 週ごとの間隔
for checkin, checkout in date_ranges:
url = f"https://www.airbnb.com/s/Austin--TX/homes?checkin={checkin}&checkout={checkout}&adults=2"
# ... 価格データをスクレイピング ...
time.sleep(random.uniform(5, 10)) # 時間間隔は控えめに
GraphQL APIのレスポンスから価格を読み取るときは、pricingQuoteオブジェクトを見てください。price.total、price.priceItems(清掃費やサービス料といった個別項目)、rate.amount(1泊料金)が入っています。
AirbnbスクレイパーをWebサイトの変更に対応させる方法
Airbnbスクレイピングを継続運用するには、取得処理だけでなく、ページやAPIの変更を検知して修正する保守設計が重要です。
壊れやすいセレクタと壊れにくいセレクタ
| セレクタ戦略 | 壊れやすさ | 実装の手間 | 例 |
|---|---|---|---|
CSSクラス名(例:.t1jojoys) | 🔴 高い — 頻繁に変わる | 低 | soup.select('.t1jojoys') |
data-testid属性 | 🟡 中 — 比較的安定 | 低 | soup.select('[data-testid="listing-card-title"]') |
| HTML内のSchema.orgマイクロデータ | 🟢 低 — 構造標準 | 中 | soup.find("meta", itemprop="name") |
| GraphQL APIインターセプト | 🟢 低 — 構造化JSON | 中 | response.json()["data"]["presentation"] |
| AIベースの抽出(Thunderbit) | 🟢 低 — AIで項目を再提案 | 低 | 2クリックUI、コード不要 |
data-testid属性を使う
現在Airbnbで確認できているdata-testidの値には、card-container、listing-card-title、listing-card-subtitle、listing-card-nameがあります。これらは見た目のスタイルではなく、Airbnb内部のテストフレームワークに紐づいているため、CSSクラスよりは書き換わりにくいです。それでもゼロではありませんが、頻度はだいぶ低めです。
# クラスベースのセレクタより頑健
title = await page.query_selector('[data-testid="listing-card-title"]')
Schema.orgマイクロデータを使う
AirbnbはHTMLマークアップにitemprop属性をそのまま付けています。これらはWeb標準に沿っているので、見た目のCSSクラスよりはるかに変わりにくいです。
# schema.orgのマークアップを使って全掲載項目を抽出
listings = soup.find_all("div", itemprop="itemListElement")
for listing in listings:
name = listing.find("meta", itemprop="name")["content"]
url = listing.find("meta", itemprop="url")["content"]
GraphQL APIをインターセプトする
DIYの選択肢では、DOM解析よりページ変更の影響を受けにくい手法です。Airbnbの内部APIは、フロントエンドで利用する構造化JSONを返します。フロントエンドもこのバックエンド構造に依存しているため、DOMを直接参照する方法と比べてレスポンス形式を継続利用しやすい場合があります。
AIベースの抽出で保守負担を減らす方法
セレクタを工夫しても、data-testidの名称やAPIレスポンスの構造が変われば修正が必要です。AIベースの抽出では、固定セレクタだけに依存せず、ページを再解析して項目を提案することで、変更時の再設定を減らせる場合があります。この方法については、このあとのThunderbitの章で説明します。
Airbnbスクレイピングでブロックされないための方法
経験とコミュニティで共有されている知恵をもとに、実践的なポイントをまとめます。
規模に応じてプロキシ運用を検討する
データセンターIPはAirbnbでブロック対象になりやすいため、取得規模や実行頻度に応じて住宅用プロキシを含む構成を検討します。性能と価格の比較対象として挙げられるプロバイダーは次のとおりです。
| プロバイダー | 価格(GBあたり) | 成功率 | 備考 |
|---|---|---|---|
| Decodo(旧Smartproxy) | 100GBで約$2.20/GB | 99.68% | 計測上最速(応答0.54秒) |
| Bright Data | 100GBで約$5.04/GB | 99%以上 | 最大規模のIPプール、機能が豊富 |
| Oxylabs | 100GBで約$4/GB | 99%以上 | EC系に強い |
経験豊富な開発者からの大事な助言があります。「リクエストごとにIPを変えるのは、むしろ怪しさの合図になる。実ユーザーはセッション中ずっと同じIPを使うものだ」。運用例として、5~10分のスティッキーセッションを使い、20~30リクエストごとにローテーションする方法があります。
proxies = {
"http": "http://user:pass@residential-proxy:port",
"https": "http://user:pass@residential-proxy:port",
}
response = cffi_requests.get(url, headers=headers, proxies=proxies, impersonate="chrome131")
リクエストを抑える
次の数値は、コミュニティで共有されている運用目安の一例です。
- 1時間あたりの最大ページ数: 100以下(約1.6/分)
- リクエスト間隔: 3~10秒(ランダム、できればガウス分布)
- セッションの休止: 20リクエストごとに30~60秒休む
- おすすめのスクレイピング時間帯: 需要の少ない時間(現地時間で午前2時頃)
- 429エラー時: ジッター付きの指数バックオフ
import random
import time
delay = random.gauss(5, 1.5) # 平均5秒、標準偏差1.5
delay = max(2, min(delay, 10)) # 2~10秒に収める
time.sleep(delay)
整合性のあるヘッダーを使う
Sec-Fetch-*ヘッダーの欠落は、403ブロックのありがちな原因です。すべてのヘッダーは内部で整合していなければなりません。User-AgentがWindows上のChrome 131を名乗るなら、他のヘッダーもその身元に揃っている必要があります。
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Sec-CH-UA": '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
"Sec-CH-UA-Platform": '"Windows"',
}
ヘッドレスブラウザは慎重に扱う
Playwrightでは、playwright-stealthパッケージが約17個の回避モジュール(navigator.webdriver、plugins、languages、WebGLなど)にパッチを当てます。ただし、最新のボット対策はパッチ対象のおよそ12項目に対して、40項目以上をチェックしてきます。非ヘッドレス(headless=False)のほうが安全ですが、そのぶん速度は落ちます。
Seleniumなら、undetected-chromedriverがChromeDriverバイナリにパッチを当てて自動化の痕跡を消しますが、ヘッドレスモードはあいかわらず不安定です。
大規模ならスクレイピングAPIも視野に入れる
数千ページを処理する場合、スクレイピングAPIを使うと、プロキシローテーション、CAPTCHA対応、JavaScriptレンダリングの実装負担を減らせます。AIMultipleによるAirbnb URL 250件のベンチマークでは、Bright Dataが掲載1件あたり48フィールドを取得し、99%の成功率を記録しました。一方で、利用量に応じたコストを見積もる必要があります。ScrapingBeeのステルスプロキシモードは1リクエストあたり75倍のクレジットを消費するため、月額49ドルのプランで利用できるステルスリクエストは約3,333回です。
Pythonを使わずにAirbnbをスクレイピングする:Thunderbitのノーコード代替案
Airbnbの価格比較や市場分析に必要なデータを、必ずしも開発者が取得するとは限りません。ホスト、不動産投資家、アナリストなど、コードの実装や継続保守に時間をかけず、結果をスプレッドシートで扱いたい利用者には、ノーコードツールが選択肢になります。
ThunderbitでAirbnbをスクレイピングする手順
Thunderbitは、Chrome拡張機能として動くAIウェブスクレイパーです。基本的な手順は次のとおりです。
- Chromeウェブストアから拡張機能をインストールする
- Airbnbの検索結果ページへ移動する — 正確な価格を取るため、URLに日付を入れておく(例:
?checkin=2025-08-01&checkout=2025-08-03) - 「AI Suggest Fields」をクリックする — Thunderbitがページを解析し、掲載名・価格・評価・所在地・URLなどの列を自動で見つける
- 「Scrape」をクリックする — データが構造化テーブルに流し込まれる
- 「Scrape Subpages」を使うと、各掲載の詳細ページを巡回し、アメニティ・レビュー・ホスト情報・価格内訳の項目を追加取得できる
- Google Sheets、Excel、Airtable、Notionへエクスポートする
サブページスクレイピングは、検索結果と各物件の詳細情報を同じ表にまとめたい場合に使えます。Pythonでは詳細ページ用の解析、レビューのページネーション、並列リクエストなどを実装する必要がありますが、Thunderbitでは画面上で対象項目とサブページ取得を設定できます。まず1つの検索結果ページで、必要な列と取得結果を照合してから対象を広げると運用しやすくなります。
ThunderbitでAirbnbスクレイピングの3つの課題に対応する方法
前述したボット対策、JavaScriptレンダリング、DOM変更は、Pythonスクレイパーの実装と保守に影響します。Thunderbitでは、次の機能を組み合わせて対応します。
- クラウド実行: Cloud Scrapingモードでは、クラウド側の実行環境とプロキシ運用を利用できる
- ページ変更への対応: AIがページを解析して項目を提案するため、固定したCSSセレクタへの依存を減らせる
- 環境構築の軽減: Seleniumドライバ、Python環境、依存関係を利用者側で構築せずに始められる
- 定期スクレイピング: 価格を継続監視する場合は、自然言語で実行間隔を指定できる。ダイナミックプライシングや競合追跡で定期データが必要な場合に利用できる
Pythonを使うべき場面、Thunderbitを使うべき場面
これはどちらか一方を選ぶ話ではなく、必要な制御範囲、保守体制、出力先、処理規模に応じて使い分けるものです。
| 必要なこと | Python | Thunderbit |
|---|---|---|
| スクレイピングロジックを完全に制御したい | ✅ はい | ❌ いいえ |
| コーディング不要で使いたい | ❌ いいえ | ✅ はい |
| DOM変更に自動対応したい | 実装・保守が必要 | AIで項目を再提案しやすい |
| サブページスクレイピング(詳細ページ) | 複雑なセットアップ | UIから設定 |
| 定期/繰り返しスクレイピング | カスタムcronジョブ | 標準搭載スケジューラ |
| Sheets/Excel/Airtableへエクスポート | 手動コード | 標準搭載 |
| データパイプラインへの統合 | ✅ はい | 制限あり |
| 大規模時のコスト(1万ページ超) | サーバー+プロキシ費用 | Thunderbitの価格 |
コードレベルの制御、独自ロジック、既存データパイプラインとの統合が必要な場合はPythonが向いています。非開発者が検索結果や詳細ページを表にし、定期的にスプレッドシートへ出力したい場合はThunderbitが候補になります。実際の対象ページ、必要な項目、処理量で試し、取得精度と運用負担を比較して選びます。
Airbnbスクレイピングの法的・倫理的な注意点
ここは短く実用的にいきます。私は弁護士ではありませんし、これは法的助言でもありません。
法的な一般論:
- hiQ Labs v. LinkedInでは、認証不要のWebサイトから公開データをスクレイピングしてもCFAA違反にはあたらないとされました
- Meta v. Bright Data(2024年1月)では、ログアウト状態のスクレイパーには利用規約の拘束力が及ばないと裁判官が判断しました
- Reddit v. Perplexity AI(2025年)は、CAPTCHAやレート制限の回避がDMCAの回避防止条項に触れる可能性があるという新しい理屈を持ち出しています。まだ未検証ですが、目を離せません
Airbnbの立場: Airbnbの利用規約は、自動化されたデータ収集をはっきり禁じています。とはいえ、Airbnbがスクレイパーを公に訴えた例はありません。Inside Airbnbは、Airbnbから「ゴミ」呼ばわりされながらも、11年以上にわたって法的異議なしに運営を続けています。
実務上の指針:
- 公開データだけをスクレイピングする(ログイン壁を越えない)
robots.txtの指針を尊重する- 攻撃的な頻度でリクエストを送り、サーバーに負荷をかけない
- GDPR/CCPAのもとで個人データを慎重に扱う
- 商用利用なら法務の専門家に相談する
まとめと重要ポイント
Airbnbスクレイピングでは、取得対象、必要な更新頻度、保守体制、処理規模によって適した方法が変わります。実装前に整理したい要点は次のとおりです。
- 価格取得ではURLに日付を指定する(
checkinとcheckoutパラメータ) — 日付がない場合は、必要な価格データを取得できないことがある - CSSクラス名だけに依存しない。
data-testid属性、schema.orgマイクロデータ、GraphQL APIインターセプトを用途に応じて使う - 大規模運用ではプロキシ構成を検討する。 IPの種類、実行頻度、対象件数を踏まえて設計する
- リクエスト頻度を管理する — 遅延、セッション運用、エラー時の指数バックオフを組み合わせる
- セレクタの保守負担を減らしたい場合は、ThunderbitのようなAIツールも比較対象になる。対象ページの変更時には、取得項目と結果を再検証する
- ツールは目的に合わせて選ぶ。 ちょっとした調査なら
pyairbnb。ダイナミックプライシング分析ならAPIインターセプト付きPlaywright。コードなしの継続監視ならThunderbit。本番規模ならスクレイピングAPI
ノーコードの手法を試す場合、Thunderbitには無料プランがあります。Airbnbの検索ページをいくつか、約2分で試せます。まず1ページで必要な列、取得精度、出力形式を確かめ、その結果をもとに対象を広げると進めやすくなります。Pythonを使う場合は、この記事のコードパターンを自分の取得条件に合わせて調整してください。
Webスクレイピングのアプローチやツールをもっと知りたい方は、ウェブスクレイピングでExcelにデータを取り込む方法:手間なく自動化するコツ、おすすめのAIウェブスクレイパー、Webスクレイピングのベストプラクティスもどうぞ。ThunderbitのYouTubeチャンネルではチュートリアル動画も公開しています。
FAQ
Airbnbはスクレイピングを理由にブロックできますか?
はい。AirbnbはAkamai Bot Managerを使い、TLSフィンガープリント、JavaScriptチャレンジ、ブラウザフィンガープリント、IPレピュテーションの評価を行っています。検知されると403、429、またはCAPTCHAが返ってきます。プロキシのローテーション、現実的なヘッダー、リクエスト抑制でリスクは下げられますが、大量アクセスで検知を完全に避ける保証はありません。
Airbnbをスクレイピングするのは合法ですか?
公開データのスクレイピングは、米国の判例法(hiQ対LinkedIn、Meta対Bright Data)では一般に許容されていますが、Airbnbの利用規約は明確に禁じています。法的状況は法域によって異なり、進行中のDMCA回避防止理論(Reddit対Perplexity)が、ボット対策を回避するスクレイパーに影響する可能性もあります。商用利用なら法務の専門家に相談してください。
Airbnbからどんなデータをスクレイピングできますか?
検索結果からは、掲載名、価格(日付あり)、評価、レビュー数、所在地、物件タイプ、URLが取れます。詳細ページまで進めば、完全な説明、アメニティ、ホスト情報、全レビュー、写真、カレンダーの空き状況、清掃費、価格内訳まで取得できます。どこまで取れるかは、検索ページだけを狙うか、個別掲載ページまで訪れるかで変わります。
PythonでAirbnbをスクレイピングするにはプロキシが必要ですか?
数ページ程度なら、プロキシなしでもなんとかなるかもしれません。20~30リクエストを超えるなら、住宅用プロキシのローテーションを強くおすすめします。データセンターIPは即ブロックです。コミュニティの共通認識では、1つのIPで1時間あたり約100ページを上限とし、リクエスト間に3~10秒のランダム遅延を入れるのが目安とされています。
コードを書かずにAirbnbをスクレイピングする方法はありますか?
ThunderbitのChrome拡張機能では、AIによるフィールド検出を使ってAirbnbの検索結果や掲載詳細ページを表にできます。セレクタ設定やコード記述を避けたい場合の選択肢です。サブページスクレイピング(アメニティ、レビュー、ホスト情報用)、Google Sheets、Excel、Airtable、Notionへのエクスポート、継続的な価格監視のための定期スクレイピングにも対応しています。対象ページと利用プランによって取得範囲が異なるため、最初に必要な項目と出力結果を照合してください。
さらに詳しく


