TripAdvisor는 사용자가 숙박, 식사, 관광 등에 대한 리뷰를 작성하는 널리 사용되는 여행 포털입니다. TripAdvisor 리뷰로 데이터를 보강하면 여행 분석, 경쟁사 연구 등에 도움이 될 수 있습니다. 이 가이드에서는 파이썬을 사용하여 TripAdvisor 데이터를 추출하는 방법과 CSV 형식으로 저장된 데이터에 대해 설명합니다.
이 스크레이퍼를 빌드하기 위해 다음 Python 라이브러리를 사용하겠습니다:
pip를 사용하여 필요한 라이브러리를 설치합니다:
pip install requests lxml
TripAdvisor와 같은 웹사이트에서 데이터를 스크랩할 때는 요청 헤더, 특히 사용자 에이전트를 올바르게 구성하는 것이 중요합니다. 이 헤더를 설정하면 정상적인 사용자가 보낸 요청으로 위장하여 비정상적인 트래픽 패턴으로 인해 스크래핑 활동이 차단을 트리거할 위험을 최소화할 수 있습니다. 또한 프록시 서버를 사용하면 단일 IP 주소에서 허용되는 요청 수와 관련된 제한을 피할 수 있으므로 보다 광범위한 데이터 수집 활동이 용이해집니다.
호텔 페이지 목록을 스크랩하고 세부 정보를 추출하여 CSV 파일로 저장하는 과정을 살펴보겠습니다. 각 부분을 세분화해 보겠습니다.
시작하려면 필요한 라이브러리를 가져옵니다:
import requests
from lxml.html import fromstring
import csv
그런 다음 데이터를 스크랩할 호텔 페이지의 URL 목록을 정의합니다:
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',
}
프록시는 IP 기반 제한을 우회하는 데 도움이 될 수 있습니다. 아래 예에서는 IP 주소 인증과 함께 프록시를 사용합니다. 요청에 프록시를 추가하는 방법은 다음과 같습니다.
proxies = {
'http': 'http://your_proxy_address:port',
'https': 'http://your_proxy_address:port',
}
response = requests.get(url, headers=headers, proxies=proxies)
각 URL에 대해 요청을 보내고 응답 HTML을 구문 분석합니다:
extracted_data = []
for url in urls_list:
response = requests.get(url, headers=headers) # 필요한 경우 proxies=proxies 추가
parser = fromstring(response.text)
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')
추출한 정보를 사전에 저장하고 목록에 추가합니다:
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 파일로 저장합니다:
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