에어비앤비 스크래핑 방법: 2026 가이드

에어비앤비 스크래핑 방법과 스크래핑을 쉽게 만드는 Bright Data의 웹 스크래핑 도구에 대해 알아보세요.
6 분 읽기
How to Scrape Airbnb

이 튜토리얼은 Python을 사용하여 Airbnb에서 공개 데이터를 수동으로 스크래핑하는 방법을 안내합니다. 수집된 데이터는 시장 동향 분석, 경쟁력 있는 가격 전략 수립, 게스트 리뷰 감정 분석 수행 또는 추천 시스템 구축에 활용할 수 있습니다.

또한 Bright Data의 고급 솔루션을 활용해 보세요. 전문 프록시와 스크래핑에 최적화된 브라우저로 데이터 추출 과정을 간소화하고 효율성을 높일 수 있습니다.

에어비앤비 데이터 스크래핑 방법

시작하기 전에 웹 스크래핑과 HTML에 대한 기본 지식을 갖추는 것이 좋습니다. 또한 컴퓨터에 Python이 설치되어 있지 않다면 반드시 설치하세요.공식 Python 가이드에서설치 방법을 상세히 안내합니다. 이미 Python이 설치된 경우 Python 3.7.9 이상으로 업데이트되었는지 확인하세요. 시작하기 전에 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)는 브라우저 바이너리를 설치하는 데 필요합니다.

에어비앤비 구조 및 데이터 객체

에어비앤비 스크래핑을 시작하기 전에 사이트 구조를 숙지하는 것이 중요합니다. 에어비앤비 메인 페이지에는 사용자 친화적인 검색창이 있어 숙소 옵션, 체험, 심지어 어드벤처까지 검색할 수 있습니다.

검색 조건을 입력하면 결과는 목록 형식으로 표시되며, 숙소 이름, 가격, 위치, 평점 및 기타 관련 세부 정보가 함께 제공됩니다. 이러한 검색 결과는 가격 범위, 숙소 유형, 이용 가능 날짜 등 다양한 매개변수를 기준으로 필터링할 수 있다는 점을 참고하세요.

초기 표시된 결과보다 더 많은 검색 결과를 원한다면 페이지 하단에 위치한 페이지네이션 버튼을 활용할 수 있습니다. 각 페이지에는 일반적으로 다수의 숙소 목록이 포함되어 있어 추가 숙소를 탐색할 수 있습니다. 페이지 상단의 필터를 통해 필요와 선호도에 따라 검색을 세분화할 수 있습니다.

에어비앤비 웹사이트의 HTML 구조를 이해하려면 다음 단계를 따르세요:

  1. 에어비앤비 웹사이트로 이동하세요.
  2. 검색창에 원하는 위치, 날짜 범위, 게스트 수를 입력하고 Enter 키를 누릅니다.
  3. 숙소 카드에서 마우스 오른쪽 버튼을 클릭하고 ‘검사’를 선택하여 브라우저 개발자 도구를 실행하세요.
  4. 스크래핑하고자 하는 데이터를 포함하는 태그와 속성을 찾아 HTML 레이아웃을 살펴봅니다.

에어비앤비 숙소 정보 스크래핑하기

에어비앤비의 구조에 대해 더 많이 알게 되었으니, Playwright를 설정하여 에어비앤비 리스팅으로 이동하고 데이터를 스크래핑하세요. 이 예에서는 리스팅의 이름, 위치, 가격 정보, 소유자 정보 및 리뷰를 수집할 것입니다.

새 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()
       # 에어비앤비 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() 함수는 비동기적으로 브라우저를 열고, 에어비앤비 홈 리스팅 페이지를 방문하여 각 리스팅의 숙소 이름, 위치, 가격 등의 세부 정보를 수집합니다. 요소를 찾지 못하면 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"
"프랑스 프레이잔스",394km 거리,"€ 181 
1박"
"독일 라니츠-하셀탈",239km 거리,"€ 185 
1박"
"스위스 호헨탄넨",291km 거리,"€ 189 
1박"
…출력 생략…

Bright Data 프록시로 웹 스크래핑 강화하기

웹사이트 스크래핑은 IP 차단이나 지역 제한 같은 문제를 일으킬 수 있습니다. 이때 Bright Data 프록시가유용하게 활용되어 이러한 장애물을 우회하고 데이터 수집 작업을 향상시킬 수 있습니다.

이전 스크립트를 여러 번 실행한 후 데이터 수신이 중단되는 현상을 경험할 수 있습니다. 이는 Airbnb에서 사용자의 IP를 탐지하여 웹사이트 스크래핑을 차단한 경우 발생할 수 있습니다.

관련 문제를 완화하기 위해 스크래핑에 프록시를 도입하는 것이 실용적인 접근법입니다. 웹 스크래핑에 프록시를 활용할 때의 장점은 다음과 같습니다:

  • IP 제한 우회
  • IP 주소 순환
  • 부하 분산은 네트워크 또는 애플리케이션 트래픽을 여러 리소스에 분산시켜 단일 구성 요소가 병목 현상이 되는 것을 방지하고 장애 발생 시 중복성을 제공합니다.

Python 스크립트에 Bright Data 프록시 통합 방법

앞서 언급한 이점들을 고려하면, 파이썬 스크립트에 Bright Data 프록시를 통합하려는 이유를 알 수 있습니다. 다행히도 이는 매우 간단합니다. Bright Data 계정을 생성하고, 프록시 설정을 구성한 후, 이를 파이썬 코드에 구현하기만 하면 됩니다.

시작하려면 Bright Data 계정을 생성해야 합니다. Bright Data 웹사이트로 이동하여 ‘무료 체험 시작’을 선택한 후 안내에 따라 진행하세요.

Bright Data 계정에 로그인한 후 왼쪽 탐색 모음의 신용카드 아이콘을 클릭하여 ‘청구’ 페이지로 이동하세요. 여기서 계정 활성화를 위해 선호하는 결제 수단을 입력해야 합니다:

다음으로 왼쪽 탐색 모음의 핀 아이콘을 클릭하여 ‘프록시 및 스크래핑 인프라’ 페이지로 이동한 후 ‘추가’ > ‘주거용 프록시’를 클릭하세요:

프록시 이름을 지정하세요(예: residential_proxy1). IP 유형에서 ‘공유’ 옵션을 선택한 후 ‘추가’를 클릭하세요:

주거용 프록시 생성 후, 코드에서 사용할 액세스 매개변수를 반드시 기록해 두세요:

Bright Data 주거용 프록시를 사용하려면 브라우저에 인증서를 설정해야 합니다. 인증서 설치 방법은 Bright Data 튜토리얼에서 확인하실 수 있습니다.

airbnb_scraping_proxy.py 파이썬 스크립트를 생성하고 다음 코드를 추가하세요:

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의 스크래핑 브라우저로 에어비앤비 데이터 수집하기

Bright Data 스크래핑 브라우저를 사용하면 스크래핑 프로세스를 더욱 효율적으로 만들 수 있습니다. 이 도구는 웹 스크래핑을 위해 특별히 설계되어 자동 차단 해제, 쉬운 확장성, 봇 탐지 소프트웨어 우회 등 다양한 이점을 제공합니다.

Bright Data 대시보드로 이동하여 핀 아이콘을 클릭해 프록시 및 스크래핑 인프라 페이지로 이동한 후, 추가 > 스크래핑 브라우저를 클릭하세요:

How to scrape Airbnb 2023 guide

이름을 지정하고(예: 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('연결됨')
       page = await browser.new_page()
       # 에어비앤비 URL로 이동
       await page.goto('https://www.airbnb.com/s/homes', timeout=120000)
       print('완료, 평가 중')
       # 전체 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('연결됨')
        page = await browser.new_page()
        # 에어비앤비 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는 이제 사전(dictionary)입니다
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 스크래핑 브라우저 사용의 이점

로컬 크로미움 인스턴스보다 Bright Data의 스크래핑 브라우저를 선택해야 하는 이유는 여러 가지입니다. 그중 몇 가지를 살펴보겠습니다:

  • 자동 차단 해제: Bright Data 스크래핑 브라우저는 CAPTCHA, 차단된 페이지 및 스크래퍼를 막기 위해 웹사이트가 사용하는 기타 문제를 자동으로 처리합니다. 이로 인해 스크래퍼가 차단될 가능성이 크게 줄어듭니다.
  • 쉬운 확장성: Bright Data 솔루션은 쉽게 확장되도록 설계되어 다수의 웹 페이지에서 동시에 데이터를 수집할 수 있습니다.
  • 봇 탐지 소프트웨어 우회: 현대 웹사이트는 정교한 봇 탐지 시스템을 사용합니다. Bright Data 스크래핑 브라우저는 인간과 유사한 행동을 성공적으로 모방하여 이러한 탐지 알고리즘을 우회할 수 있습니다.

또한 수동 데이터 스크래핑이나 스크립트 설정이 너무 시간 소모적이거나 복잡하게 느껴진다면, Bright Data 맞춤형 데이터셋이 훌륭한 대안입니다. 자체 스크래핑 없이도 접근 및 분석이 가능한 에어비앤비(Airbnb) 숙소 정보를 포함한 에어비앤비 데이터셋을 제공합니다.

데이터 세트를 보려면 왼쪽 탐색 메뉴에서 ‘웹 데이터’를 클릭한 후 ‘데이터셋 마켓플레이스’를 선택하고 ‘에어비앤비’를 검색하세요. ‘데이터셋 보기’를 클릭하면 필터를 적용하고 원하는 데이터를 구매할 수 있습니다. 원하는 레코드 수에 따라 요금이 부과됩니다:

결론

이 튜토리얼에서는 Python을 사용해 에어비앤비 리스팅에서 데이터를 추출하는 방법을 배우고, Bright Data의 프록시 및 스크래핑 브라우저 같은 도구가 이 작업을 더욱 쉽게 만드는 방법을 확인했습니다.

Bright Data는 Airbnb뿐만 아니라 모든 웹사이트에서 데이터를 빠르고 쉽게 수집할 수 있도록 지원하는 도구 세트를 제공합니다. 이 도구들은 복잡한 웹 스크래핑 작업을 단순화하여 시간과 노력을 절약해 줍니다. 어떤 제품이 필요한지 잘 모르시겠나요? Bright Data의 웹 데이터 전문가와 상담하여 데이터 요구 사항에 맞는 최적의 솔루션을 찾아보세요.

다른 웹사이트 스크래핑에 관심이 있으신가요? 아래 글로 계속해 보세요:

참고: 본 가이드는 작성 당시 저희 팀이 철저히 테스트했으나, 웹사이트는 코드와 구조를 자주 업데이트하므로 일부 단계가 예상대로 작동하지 않을 수 있습니다.