Руководство по скрапингу данных с 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 комментариев