Посібник зі скрапінгу даних з TripAdvisor з використанням Python

Коментарі: 0

TripAdvisor - провідний веб-сайт для мандрівників, на якому зібрано мільйони відгуків про різноманітні точки інтересу, як-от готелі, ресторани та визначні пам'ятки. Збір даних відгуків з TripAdvisor може надати цінні інсайти для аналітики у сфері туризму, моніторингу репутації та порівняльного аналізу конкурентів. Цей посібник надасть інструкції з вилучення інформації з TripAdvisor з використанням мови програмування Python, а також зі збереження цих даних у форматі CSV для зручності подальшого аналізу.

Встановлення необхідних бібліотек

Для реалізації скрапера, що збирає дані з TripAdvisor, необхідно використовувати такі бібліотеки Python:

  • requests: для надсилання HTTP-запитів і отримання вмісту веб-сторінок;
  • lxml: для парсингу HTML і вилучення даних за допомогою XPath.

Встановіть ці бібліотеки, використовуючи таку команду pip:


pip install requests lxml

Покроковий процес скрапінгу даних з TripAdvisor

Ми розглянемо процес скрапінгу списку сторінок готелів, вилучення даних і збереження їх у CSV-файл. Розберемо кожен етап по порядку.

Крок 1. Імпорт бібліотек і налаштування URL-адрес

Для початку необхідно імпортувати бібліотеки, що використовуються, і визначити список URL-адрес сторінок готелів, з яких витягуватимуть дані:


import requests
from lxml.html import fromstring
import csv

Потім, вкажіть список URL-адрес сторінок готелів, з яких будуть витягуватися дані:


urls_list = [
    'Https ссылка',
    'Https ссылка'
]

Крок 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)  # Додайте проксі за необхідності
    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 ссылка',
    'Https ссылка'
]

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 Коментаріїв