このチュートリアルでは、Pythonを使用してAirbnbから公開データを手動でスクレイピングする方法を解説します。収集したデータは、市場動向の分析、競争力のある価格戦略の策定、ゲストレビューからの感情分析、またはレコメンデーションシステムの構築に役立ちます。
さらに、Bright Dataの高度なソリューションもご検討ください。同社の専用プロキシとスクレイピングブラウザは、データ抽出プロセスを簡素化・強化します。
Airbnbのスクレイピング方法
本題に入る前に、ウェブスクレイピングとHTMLに関する基礎知識があることが推奨されます。また、Pythonがインストールされていない場合は、事前にインストールしてください。公式Pythonガイドに詳細な手順が記載されています。既にPythonがインストールされている場合は、Python 3.7.9以降に更新されていることを確認してください。開始前にPythonウェブスクレイピングチュートリアル全文を読むこともお勧めします。
Pythonのインストールが完了したら、ターミナルまたはコマンドラインインターフェースを起動し、以下のコマンドで新しいプロジェクトディレクトリの作成を開始します:
mkdir airbnb-scraper && cd airbnb-scraper
新しいプロジェクトディレクトリを作成したら、ウェブスクレイピングに使用する追加ライブラリを設定する必要があります。具体的には、PythonでHTTPリクエストを可能にするライブラリ「Requests」、データ操作と分析に特化した堅牢なライブラリ「pandas」、HTMLコンテンツのパース用「Beautiful Soup (BS4)」、ブラウザベースのタスク自動化用「Playwright」を利用します。
これらのライブラリをインストールするには、ターミナルまたはシェルを開き、以下のコマンドを実行します:
pip3 install beautifulsoup4
pip3 install requests
pip3 install pandas
pip3 install playwright
playwright install
このチュートリアルの次のステップに進む前に、インストールプロセスがエラーなく完了していることを確認してください。
注:最後のコマンド(
playwright install)はブラウザバイナリのインストールに必須です。
Airbnbの構造とデータオブジェクト
Airbnbのスクレイピングを始める前に、その構造を理解することが重要です。Airbnbのメインページには使いやすい検索バーが配置されており、宿泊施設、体験、さらにはアドベンチャーを検索できます。
検索条件を入力すると、結果がリスト形式で表示され、物件名、価格、場所、評価、その他の関連詳細が表示されます。これらの検索結果は、価格帯、物件タイプ、利用可能日などの様々なパラメータに基づいてフィルタリングできる点に留意してください。
最初に表示される検索結果以上の情報を得たい場合は、ページ下部のページネーションボタンを利用できます。各ページには通常多数の物件が掲載されており、追加の物件を閲覧することが可能です。ページ上部のフィルター機能を使用すれば、ニーズや好みに応じて検索条件を絞り込むことができます。
AirbnbウェブサイトのHTML構造を理解するには、以下の手順に従ってください:
- Airbnbのウェブサイトにアクセスします。
- 検索バーに希望の場所、日程範囲、宿泊人数を入力し、Enterキーを押します。
- 物件カード上で右クリックし、「要素を検査」を選択してブラウザの開発者ツールを起動します。
- HTMLレイアウトを調査し、スクレイピング対象のデータを含むタグと属性を特定します。
Airbnbリスティングのスクレイピング
Airbnbの構造を理解したところで、Playwrightを設定してAirbnbリスティングに移動し、データをスクレイピングします。この例では、リスティング名、場所、価格詳細、オーナー詳細、レビューを収集します。
新しいPythonスクリプトairbnb_scraper.pyを作成し、以下のコードを追加します:
import asyncio
from playwright.async_api import async_playwright
import pandas as pd
async def scrape_airbnb():
async with async_playwright() as pw:
# 新しいブラウザを起動
browser = await pw.chromium.launch(headless=False)
page = await browser.new_page()
# Airbnb URLに移動
await page.goto('https://www.airbnb.com/s/homes', timeout=600000)
# リスティングの読み込み待ち
await page.wait_for_selector('div.g1qv1ctd.c1v0rf5q.dir.dir-ltr')
# 情報の抽出
results = []
listings = await page.query_selector_all('div.g1qv1ctd.c1v0rf5q.dir.dir-ltr')
for listing in listings:
result = {}
# 物件名
name_element = await listing.query_selector('div[data-testid="listing-card-title"]')
if name_element:
result['property_name'] = await page.evaluate("(el) => el.textContent", name_element)
else:
result['property_name'] = 'N/A'
# 所在地
location_element = await listing.query_selector('div[data-testid="listing-card-subtitle"]')
result['location'] = await location_element.inner_text() if location_element else 'N/A'
# Price
price_element = await listing.query_selector('div._1jo4hgw')
result['price'] = await price_element.inner_text() if price_element else 'N/A'
results.append(result)
# ブラウザを閉じる
await browser.close()
return results
# スクレイパーを実行し結果をCSVファイルに保存
results = asyncio.run(scrape_airbnb())
df = pd.DataFrame(results)
df.to_csv('airbnb_listings.csv', index=False)
関数scrape_airbnb() は非同期でブラウザを開き、Airbnb のホームリスティングページにアクセスし、各リスティングから物件名、場所、価格などの詳細情報を収集します。要素が見つからない場合はN/A とマークされます。処理後、取得したデータは pandas DataFrame に格納され、airbnb_listings.csv という名前の CSV ファイルとして保存されます。
スクリプトを実行するには、ターミナルまたはシェルで `python3 airbnb_scraper.py` を実行してください。CSVファイルは以下のような形式になります:
property_name,location,price
"Brand bei Bludenz, Austria",343 kilometers away,"€ 2,047
night"
"Saint-Nabord, France",281 kilometers away,"€ 315
night"
"Kappl, Austria",362 kilometers away,"€ 1,090
night"
"フランス、フレザン",394キロメートル離れて,"€ 181
1泊"
"ドイツ、ラニッツ=ハッセル=タール",239キロメートル離れて,"€ 185
1泊"
"スイス、ホーエントネン",291キロメートル離れて,"€ 189
1泊"
…出力省略…
Bright Dataプロキシでウェブスクレイピングを強化
ウェブサイトのスクレイピングでは、IPブロックや地域制限といった課題が生じることがあります。こうした障壁を回避し、データ収集作業を強化するのにBrightDataプロキシが役立ちます。
上記スクリプトを数回実行すると、データ受信が停止する場合があります。これはAirbnbがIPを検知し、ウェブサイトスクレイピングをブロックしたためです。
関連する課題を軽減するには、スクレイピングにプロキシを導入するのが現実的な解決策です。ウェブスクレイピングにプロキシを活用する主な利点は以下の通りです:
- IP制限の回避
- IPアドレスのローテーション
- 負荷分散は、ネットワークやアプリケーションのトラフィックを複数のリソースに分散させることで、単一コンポーネントがボトルネックになるのを防ぎ、障害発生時の冗長性を確保します。
PythonスクリプトへのBright Dataプロキシの統合方法
前述の利点から、PythonスクリプトにBright Dataのプロキシを組み込む理由がお分かりいただけるでしょう。幸いなことに、その方法は簡単です。Bright Dataアカウントの作成、プロキシ設定の構成、そしてPythonコード内での実装を行うだけです。
まずBright Dataアカウントを作成します。Bright Dataウェブサイトにアクセスし、「無料トライアル」を選択、指示に従って進めてください。
Bright Dataアカウントにログインし、左ナビゲーションバーのクレジットカードアイコンをクリックして「請求」ページにアクセスします。ここでアカウントを有効化するため、ご希望の支払い方法を入力してください:

次に、左ナビゲーションバーのピンアイコンをクリックして「プロキシ&スクレイピングインフラ」ページに移動し、「追加」>「レジデンシャルプロキシ」をクリックします:

プロキシに名前を付け(例:residential_proxy1)、IPタイプで「共有」オプションを選択します。その後「追加」をクリック:

レジデンシャルプロキシを作成したら、コードで使用する「アクセスパラメータ」を必ず控えてください:

Bright Dataのレジデンシャルプロキシを利用するには、ブラウザに証明書を設定する必要があります。証明書のインストール手順は、こちらのBright Dataチュートリアルでご確認いただけます。
新しいairbnb_scraping_proxy.py Pythonスクリプトを作成し、以下のコードを追加します:
from playwright.sync_api import sync_playwright
import pandas as pd
def run(playwright):
browser = playwright.chromium.launch()
context = browser.new_context()
# プロキシ設定
proxy_username='YOUR_BRIGHTDATA_PROXY_USERNAME'
proxy_password='YOUR_BRIGHTDATA_PROXY_PASSWORD'
proxy_host = 'YOUR_BRIGHTDATA_PROXY_HOST'
proxy_auth=f'{proxy_username}:{proxy_password}'
proxy_server = f'http://{proxy_auth}@{proxy_host}'
context = browser.new_context(proxy={
'server': proxy_server,
'username': proxy_username,
'password': proxy_password
})
page = context.new_page()
page.goto('https://www.airbnb.com/s/homes')
# ページの読み込み完了を待機
page.wait_for_load_state("networkidle")
# データの抽出
results = page.eval_on_selector_all('div.g1qv1ctd.c1v0rf5q.dir.dir-ltr', '''(listings) => {
return listings.map(listing => {
return {
property_name: listing.querySelector('div[data-testid="listing-card-title"]')?.innerText || 'N/A',
location: listing.querySelector('div[data-testid="listing-card-subtitle"]')?.innerText || 'N/A',
price: listing.querySelector('div._1jo4hgw')?.innerText || 'N/A'
}
})
}''')
df = pd.DataFrame(results)
df.to_csv('airbnb_listings_scraping_proxy.csv', index=False)
# ブラウザを閉じる
browser.close()
with sync_playwright() as playwright:
run(playwright)
このコードはPlaywrightライブラリを使用して、特定のプロキシサーバーを設定したChromiumブラウザを起動します。Airbnbのホームページに移動し、物件名、場所、価格などの詳細情報をリストから抽出し、pandasを使用してデータをCSVファイルに保存します。データ抽出後、ブラウザは閉じられます。
注:
proxy_username、proxy_password、proxy_hostは、ご自身の Bright Data アクセスパラメータに置き換えてください。
スクリプトを実行するには、ターミナルまたはシェルで `python3 airbnb_scraping_proxy.py` を実行してください。スクレイピングされたデータは `airbnb_listings_scraping_proxy.csv` という名前のCSVファイルに保存されます。CSVファイルは以下のような形式になります:
property_name,location,price
"Sithonia, Greece",Lagomandra,"$3,305
night"
"Apraos, Greece","1,080 kilometers away","$237
night"
"Magnisia, Greece",Milopotamos Paralympic,"$200
night"
"Vourvourou, Greece",861 kilometers away,"$357
night"
"Rovies, Greece","1,019 kilometers away","$1,077
night"
…出力省略…
Bright DataのスクラッピングブラウザでAirbnbをスクレイピング
Bright Dataスクレイピングブラウザを使用すると、スクレイピングプロセスをさらに効率化できます。このツールはウェブスクレイピング専用に設計されており、自動ブロック解除、容易なスケーリング、ボット検出ソフトウェアの回避など、様々な利点を提供します。
Bright Dataダッシュボードに移動し、ピンアイコンをクリックして「プロキシ&スクレイピングインフラストラクチャ」ページへアクセス。次に「追加」>「スクレイピングブラウザ」をクリック:

名前を付け(例:scraping_browser)、「追加」をクリック:

次に「アクセスパラメータ」を選択し、ユーザー名、ホスト、パスワードを記録します。これらの情報は後述の手順で必要になります:

これらの手順が完了したら、airbnb_scraping_brower.py という名前の新しい Python スクリプトを作成し、以下のコードを追加します:
import asyncio
from playwright.async_api import async_playwright
from bs4 import BeautifulSoup
import pandas as pd
username='YOUR_BRIGHTDATA_USERNAME'
password='YOUR_BRIGHTDATA_PASSWORD'
auth=f'{username}:{password}'
host = 'YOUR_BRIGHTDATA_HOST'
browser_url = f'wss://{auth}@{host}'
async def scrape_airbnb():
async with async_playwright() as pw:
# 新しいブラウザを起動
print('connecting')
browser = await pw.chromium.connect_over_cdp(browser_url)
print('connected')
page = await browser.new_page()
# Airbnb URLへ移動
await page.goto('https://www.airbnb.com/s/homes', timeout=120000)
print('done, evaluating')
# HTMLコンテンツ全体を取得
html_content = await page.evaluate('()=>document.documentElement.outerHTML')
# Beautiful SoupでHTMLをパース
soup = BeautifulSoup(html_content, 'html.parser')
# 情報を抽出
results = []
listings = soup.select('div.g1qv1ctd.c1v0rf5q.dir.dir-ltr')
for listing in listings:
result = {}
# 物件名
name_element = listing.select_one('div[data-testid="listing-card-title"]')
result['property_name'] = name_element.text if name_element else 'N/A'
# 所在地
location_element = listing.select_one('div[data-testid="listing-card-subtitle"]')
result['location'] = location_element.text if location_element else 'N/A'
# 価格
price_element = listing.select_one('div._1jo4hgw')
result['price'] = price_element.text if price_element else 'N/A'
results.append(result)
# ブラウザを閉じる
await browser.close()
return results
# スクレイパーを実行し結果をCSVファイルに保存
results = asyncio.run(scrape_airbnb())
df = pd.DataFrame(results)
df.to_csv('airbnb_listings_scraping_browser.csv', index=False)
このコードはBright Dataプロキシを使用してChromiumブラウザに接続し、Airbnbサイトから物件詳細(名称、所在地、価格など)をスクレイピングブラウザでスクレイピングします。取得したデータはリストに格納され、DataFrameとして保存された後、airbnb_listings_scraping_browser.csvという名前のCSVファイルにエクスポートされます。
注:
ユーザー名、パスワード、ホストは、ご自身のBright Dataアクセスパラメータに置き換えてください。
ターミナルまたはシェルからコードを実行してください:
python3 airbnb_scraping_browser.py
プロジェクト内にairbnb_listings_scraping_browser.csvという新しいCSVファイルが作成されます。ファイルの内容は次のようになります:
property_name,location,price
"Benton Harbor, Michigan",Round Lake,"$514
night"
"Pleasant Prairie, Wisconsin",Lake Michigan,"$366
night"
"New Buffalo, Michigan",Lake Michigan,"$2,486
night"
"Fox Lake, Illinois",Nippersink Lake,"$199
night"
"Salem, Wisconsin",Hooker Lake,"$880
night"
…出力省略…
次に、単一リスティングに関連するデータをスクレイピングします。新しいPythonスクリプトairbnb_scraping_single_listing.pyを作成し、以下のコードを追加してください:
import asyncio
from playwright.async_api import async_playwright
from bs4 import BeautifulSoup
import pandas as pd
username='YOUR_BRIGHTDATA_USERNAME'
password='YOUR_BRIGHTDATA_PASSWORD'
auth=f'{username}:{password}'
host = 'YOUR_BRIGHTDATA_HOST'
browser_url = f'wss://{auth}@{host}'
async def scrape_airbnb_listing():
async with async_playwright() as pw:
# 新しいブラウザを起動
print('connecting')
browser = await pw.chromium.connect_over_cdp(browser_url)
print('connected')
page = await browser.new_page()
# Airbnb URL に移動
await page.goto('https://www.airbnb.com/rooms/26300485', timeout=120000)
print('完了、評価中')
# コンテンツの読み込みを待機
await page.wait_for_selector('div.tq51prx.dir.dir-ltr h2')
# HTMLコンテンツ全体を取得
html_content = await page.evaluate('()=>document.documentElement.outerHTML')
# Beautiful SoupでHTMLをパース
soup = BeautifulSoup(html_content, 'html.parser')
# ホスト名を抽出
host_div = soup.select_one('div.tq51prx.dir.dir-ltr h2')
host_name = host_div.text.split("hosted by ")[-1] if host_div else 'N/A'
print(f'ホスト名: {host_name}')
# レビューを抽出
reviews_span = soup.select_one('span._s65ijh7 button')
reviews = reviews_span.text.split(" ")[0] if reviews_span else 'N/A'
print(f'レビュー: {reviews}')
# ブラウザを閉じる
await browser.close()
return {
'host_name': host_name,
'reviews': reviews,
}
# スクレイパーを実行し結果をCSVファイルに保存
results = asyncio.run(scrape_airbnb_listing())
df = pd.DataFrame([results]) # resultsは辞書型
df.to_csv('scrape_airbnb_listing.csv', index=False)
このコードでは、目的のリスティングURLにアクセスし、HTMLコンテンツを抽出します。Beautiful Soupでパースしてホスト名とレビュー数を取得し、最後にpandasを使用して抽出した詳細をCSVファイルに保存します。
ターミナルまたはシェルからコードを実行します:
python3 airbnb_scraping_single_listing.py
プロジェクト内に「scrape_airbnb_listing.csv」という新しいCSVファイルが生成されます。このファイルの内容は以下のような形式になります:
host_name,reviews
Amelia,88
このチュートリアルの全コードは、こちらのGitHubリポジトリで公開されています。
Bright Dataスクレイピングブラウザ を使用するメリット
ローカルChromiumインスタンスではなくBright Dataのスクレイピングブラウザを選択すべき理由はいくつかあります。主な利点を以下に示します:
- 自動アンブロック機能: Bright Data スクレイピングブラウザは、CAPTCHAやブロックされたページなど、ウェブサイトがスクレイパー対策に使用する様々な課題を自動的に処理します。これによりスクレイパーがブロックされる可能性が大幅に低減されます。
- 容易なスケーリング:Bright Dataのソリューションは容易にスケーリングできるよう設計されており、多数のウェブページから同時にデータを収集できます。
- ボット検知ソフトウェアの回避:現代のウェブサイトは高度なボット検知システムを採用しています。Bright Dataスクレイピングブラウザは人間のような行動を模倣し、これらの検知アルゴリズムを巧妙に回避します。
さらに、手動でのデータスクレイピングやスクリプト設定が時間のかかる複雑な作業に感じられる場合、Bright Dataのカスタムデータセットが優れた代替手段となります。Airbnbデータセットでは、Airbnb物件に関する情報をスクレイピング作業なしに直接アクセス・分析可能です。
データセットを閲覧するには、左ナビゲーションメニューから「Webデータ」をクリックし、「データセットマーケットプレイス」を選択して「Airbnb」を検索してください。「データセットを表示」をクリックすると、このページからフィルターを適用し、必要なデータを購入できます。料金は必要なレコード数に基づいて課金されます:

まとめ
このチュートリアルでは、Pythonを使用してAirbnbリスティングからデータを抽出する方法を学び、プロキシやスクレイピングブラウザなどのBright Dataツールがこの作業をさらに容易にする様子を確認しました。
Bright DataはAirbnbだけでなくあらゆるウェブサイトからデータを迅速かつ容易に収集できるツール群を提供しています。これらのツールは複雑なウェブスクレイピング作業を簡素化し、時間と労力を節約します。必要な製品がわからない場合は、Bright Dataのウェブデータ専門家にご相談ください。お客様のデータニーズに最適なソリューションをご提案します。
他のウェブサイトのスクレイピングにご興味がありますか?以下の記事をご覧ください:
注:本ガイドは執筆時点で当社チームにより徹底的にテストされていますが、ウェブサイトは頻繁にコードや構造を更新するため、一部の手順が期待通りに機能しなくなる可能性があります。