Python을 사용하여 TripAdvisor 데이터를 스크랩하는 방법

댓글: 0

TripAdvisor는 사용자가 숙박, 식사, 관광 등에 대한 리뷰를 작성하는 널리 사용되는 여행 포털입니다. TripAdvisor 리뷰로 데이터를 보강하면 여행 분석, 경쟁사 연구 등에 도움이 될 수 있습니다. 이 가이드에서는 파이썬을 사용하여 TripAdvisor 데이터를 추출하는 방법과 CSV 형식으로 저장된 데이터에 대해 설명합니다.

필수 라이브러리 설치

이 스크레이퍼를 빌드하기 위해 다음 Python 라이브러리를 사용하겠습니다:

  • requests: 페이지 콘텐츠를 가져오기 위한 HTTP 요청을 수행합니다.
  • lxml: HTML 콘텐츠를 구문 분석하고 XPath로 요소를 추출하는 데 사용됩니다.

pip를 사용하여 필요한 라이브러리를 설치합니다:


pip install requests lxml

효과적인 데이터 스크래핑에서 헤더와 프록시의 역할

TripAdvisor와 같은 웹사이트에서 데이터를 스크랩할 때는 요청 헤더, 특히 사용자 에이전트를 올바르게 구성하는 것이 중요합니다. 이 헤더를 설정하면 정상적인 사용자가 보낸 요청으로 위장하여 비정상적인 트래픽 패턴으로 인해 스크래핑 활동이 차단을 트리거할 위험을 최소화할 수 있습니다. 또한 프록시 서버를 사용하면 단일 IP 주소에서 허용되는 요청 수와 관련된 제한을 피할 수 있으므로 보다 광범위한 데이터 수집 활동이 용이해집니다.

TripAdvisor 스크랩을 위한 단계별 가이드

호텔 페이지 목록을 스크랩하고 세부 정보를 추출하여 CSV 파일로 저장하는 과정을 살펴보겠습니다. 각 부분을 세분화해 보겠습니다.

1단계. 라이브러리 가져오기 및 URL 설정

시작하려면 필요한 라이브러리를 가져옵니다:


import requests
from lxml.html import fromstring
import csv

그런 다음 데이터를 스크랩할 호텔 페이지의 URL 목록을 정의합니다:


urls_list = [
    'Https link',
    'Https link'
]

2단계. 요청에 대한 헤더 설정

요청이 실제 브라우저의 요청을 모방하도록 하려면 헤더를 올바르게 구성하는 것이 중요합니다. 이 단계는 웹사이트의 봇 방지 시스템을 우회하고 차단될 위험을 최소화하는 데 도움이 됩니다.


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
}

3단계. 프록시 사용

프록시는 IP 기반 제한을 우회하는 데 도움이 될 수 있습니다. 아래 예에서는 IP 주소 인증과 함께 프록시를 사용합니다. 요청에 프록시를 추가하는 방법은 다음과 같습니다.


proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'http://your_proxy_address:port',
}
response = requests.get(url, headers=headers, proxies=proxies)

4단계. 요청 전송 및 HTML 구문 분석

각 URL에 대해 요청을 보내고 응답 HTML을 구문 분석합니다:


extracted_data = []
for url in urls_list:
    response = requests.get(url, headers=headers)  # 필요한 경우 proxies=proxies 추가
    parser = fromstring(response.text)

5단계. XPath를 사용하여 데이터 추출

XPath를 사용하면 페이지의 특정 요소를 타겟팅할 수 있습니다:


 title = parser.xpath('//h1[@data-automation="mainH1"]/text()')[0]
    about = parser.xpath('//div[@class="_T FKffI bmUTE"]/div/div/text()')[0].strip()
    images_url = parser.xpath('//div[@data-testid="media_window_test"]/div/div/button/picture/source/@srcset')
    price = parser.xpath('//div[@data-automation="commerce_module_visible_price"]/text()')[0]
    ratings = parser.xpath('//div[@class="jVDab W f u w GOdjs"]/@aria-label')[0].split(' ')[0]
    features = parser.xpath('//div[@class="f Q2 _Y tyUdl"]/div[2]/span/span/span/text()')
    reviews = parser.xpath('//span[@class="JguWG"]/span//text()')
    listing_by = parser.xpath('//div[@class="biGQs _P pZUbB KxBGd"]/text()')[0]
    similar_experiences = parser.xpath('//div[@data-automation="shelfCard"]/a/@href')

6단계. 추출한 데이터 저장

추출한 정보를 사전에 저장하고 목록에 추가합니다:


data = {
        'title': title,
        'about': about,
        'price': price,
        'listing by': listing_by,
        'ratings': ratings,
        'image_urls': images_url,
        'features': features,
        'reviews': reviews,
        'similar_experiences': similar_experiences
    }
    extracted_data.append(data)

7단계. 데이터를 CSV로 저장

스크랩 후 데이터를 CSV 파일로 저장합니다:


csv_columns = ['title', 'about', 'price', 'listing by', 'ratings', 'image_urls', 'features', 'reviews', 'similar_experiences']

with open("tripadvisor_data.csv", 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=csv_columns)
    writer.writeheader()
    for data in extracted_data:
        writer.writerow(data)

코드 완성


import requests
from lxml.html import fromstring
import csv

urls_list = [
    'Https link',
    'Https link'
]

headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
}

proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'http://your_proxy_address:port',
}

extracted_data = []
for url in urls_list:
    response = requests.get(url, headers=headers, proxies=proxies)  
    parser = fromstring(response.text)
    
    title = parser.xpath('//h1[@data-automation="mainH1"]/text()')[0]
    about = parser.xpath('//div[@class="_T FKffI bmUTE"]/div/div/text()')[0].strip()
    images_url = parser.xpath('//div[@data-testid="media_window_test"]/div/div/button/picture/source/@srcset')
    price = parser.xpath('//div[@data-automation="commerce_module_visible_price"]/text()')[0]
    ratings = parser.xpath('//div[@class="jVDab W f u w GOdjs"]/@aria-label')[0].split(' ')[0]
    features = parser.xpath('//div[@class="f Q2 _Y tyUdl"]/div[2]/span/span/span/text()')
    reviews = parser.xpath('//span[@class="JguWG"]/span//text()')
    listing_by = parser.xpath('//div[@class="biGQs _P pZUbB KxBGd"]/text()')[0]
    similar_experiences = parser.xpath('//div[@data-automation="shelfCard"]/a/@href')
    
    data = {
        'title': title,
        'about': about,
        'price': price,
        'listing by': listing_by,
        'ratings': ratings,
        'image_urls': images_url,
        'features': features,
        'reviews': reviews,
        'similar_experiences': similar_experiences
    }
    extracted_data.append(data)

csv_columns = ['title', 'about', 'price', 'listing by', 'ratings', 'image_urls', 'features', 'reviews', 'similar_experiences']

with open("tripadvisor_data.csv", 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=csv_columns)
    writer.writeheader()
    for data in extracted_data:
        writer.writerow(data)

print('saved into tripadvisor_data.csv')

이 가이드는 데이터 스크래핑을 위한 기술적 토대를 마련할 뿐만 아니라 관광 분야에서 포괄적인 분석을 위한 길을 열어줍니다. 여기에 설명된 방법과 기법을 통해 사용자는 시장 트렌드와 소비자 행동에 대해 더 깊이 파고들 수 있습니다. 이러한 인사이트는 강력한 평판 관리 전략을 개발하고 경쟁 분석을 수행하는 데 매우 중요합니다. 이 가이드를 활용하면 관광 산업 내 역학 관계에 대한 이해를 높여 정보에 입각한 전략적 의사결정을 내릴 수 있어 성공을 이끌 수 있습니다.

댓글:

0 댓글