Jak zeskrobać dane TripAdvisor za pomocą Pythona

Komentarze: 0

TripAdvisor to powszechnie używany portal turystyczny, w którym użytkownicy piszą recenzje dotyczące zakwaterowania, restauracji, zwiedzania itp. Wzbogacenie danych o recenzje TripAdvisor może być pomocne w analizie podróży, badaniach konkurencji itp. W tym przewodniku omówimy, w jaki sposób można wyodrębnić dane TripAdvisor za pomocą Pythona i zapisać je w formacie csv.

Instalacja wymaganych bibliotek

Aby zbudować ten scraper, użyjemy następujących bibliotek Pythona:

  • requests: Do wykonywania żądań HTTP w celu uzyskania zawartości strony.
  • lxml: Do analizowania zawartości HTML i wyodrębniania elementów za pomocą XPath.

Zainstaluj wymagane biblioteki za pomocą pip:


pip install requests lxml

Rola nagłówków i serwerów proxy w skutecznym skrobaniu danych

Podczas skrobania danych z witryn takich jak TripAdvisor kluczowe znaczenie ma prawidłowe skonfigurowanie nagłówków żądań, zwłaszcza User-Agent. Ustawiając ten nagłówek, można ukryć swoje żądania jako pochodzące od legalnych użytkowników, co minimalizuje ryzyko, że działania związane ze skrobaniem spowodują blokady z powodu nietypowych wzorców ruchu. Ponadto korzystanie z serwerów proxy jest niezbędne do obejścia ograniczeń związanych z liczbą żądań dozwolonych z jednego adresu IP, ułatwiając w ten sposób bardziej rozległe gromadzenie danych.

Przewodnik krok po kroku po scrapingu TripAdvisor

Przejdziemy przez proces skrobania listy stron hoteli, wyodrębniania szczegółów i zapisywania ich w pliku CSV. Podzielmy się na poszczególne części.

Krok 1. Zaimportuj biblioteki i skonfiguruj adresy URL

Aby rozpocząć, zaimportuj niezbędne biblioteki:


import requests
from lxml.html import fromstring
import csv

Następnie zdefiniuj listę adresów URL stron hoteli, z których zamierzasz pobierać dane:


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

Krok 2. Ustawianie nagłówków dla żądań

Aby upewnić się, że żądania naśladują te z prawdziwej przeglądarki, kluczowe jest prawidłowe skonfigurowanie nagłówków. Ten krok pomaga ominąć systemy ochrony przed botami na stronach internetowych i minimalizuje ryzyko zablokowania.


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',
}

Krok 3. Korzystanie z serwerów proxy

Serwery proxy mogą pomóc ominąć ograniczenia oparte na adresie IP. W poniższym przykładzie używamy serwera proxy z uwierzytelnianiem adresu IP. Oto jak dodać serwer proxy do żądań.


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

Krok 4. Wysyłanie żądań i analizowanie kodu HTML

Dla każdego adresu URL wyślij żądanie i przeanalizuj HTML odpowiedzi:


extracted_data = []
for url in urls_list:
    response = requests.get(url, headers=headers)  # W razie potrzeby dodaj proxy=proxy
    parser = fromstring(response.text)

Krok 5. Wyodrębnianie danych przy użyciu XPath

Używając XPath, możemy kierować się na konkretne elementy na stronie:


 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')

Krok 6. Przechowywanie wyodrębnionych danych

Przechowuje wyodrębnione informacje w słowniku i dołącza je do listy:


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)

Krok 7. Zapisywanie danych do pliku CSV

Po skrobaniu zapisz dane w pliku 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)

Kompletny kod


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')

Niniejszy przewodnik nie tylko kładzie techniczne podwaliny pod skrobanie danych, ale także otwiera możliwości kompleksowej analizy w sektorze turystycznym. Opisane tu metody i techniki pozwalają użytkownikom zagłębić się w trendy rynkowe i zachowania konsumentów. Takie spostrzeżenia są kluczowe dla opracowania solidnych strategii zarządzania reputacją i przeprowadzania analiz konkurencji. Korzystając z tego przewodnika, użytkownicy mogą lepiej zrozumieć dynamikę branży turystycznej, umożliwiając podejmowanie świadomych, strategicznych decyzji, które napędzają sukces.

Komentarze:

0 komentarze