Cómo extraer datos de TripAdvisor con Python

Comentarios: 0

TripAdvisor es un portal de viajes muy utilizado en el que los usuarios escriben opiniones sobre alojamiento, restaurantes, visitas turísticas, etc. Enriquecer los datos con las opiniones de TripAdvisor puede ser útil para realizar análisis de viajes, estudios de la competencia, etc. En esta guía, explicaremos cómo se pueden extraer los datos de TripAdvisor mediante Python y almacenarlos en formato csv.

Instalación de las bibliotecas necesarias

Para construir este scraper, utilizaremos las siguientes librerías de Python:

  • requests: Para realizar peticiones HTTP para obtener el contenido de la página.
  • lxml: Para analizar contenido HTML y extraer elementos con XPath.

Instale las bibliotecas necesarias mediante pip:


pip install requests lxml

El papel de las cabeceras y los proxies en el raspado eficaz de datos

Cuando se extraen datos de sitios web como TripAdvisor, es fundamental configurar correctamente las cabeceras de las solicitudes, especialmente User-Agent. Al configurar esta cabecera, puedes disfrazar tus solicitudes como si procedieran de usuarios legítimos, lo que minimiza el riesgo de que tus actividades de scraping provoquen bloqueos debido a patrones de tráfico inusuales. Además, el empleo de servidores proxy es esencial para eludir las restricciones relacionadas con el número de solicitudes permitidas desde una única dirección IP, facilitando así esfuerzos de recopilación de datos más amplios.

Guía paso a paso para el scraping de TripAdvisor

Vamos a pasar por el proceso de raspado de una lista de páginas de hoteles, la extracción de los detalles, y guardarlos en un archivo CSV. Vamos a desglosar cada parte.

Paso 1. Importar bibliotecas y configurar URL

Para empezar, importe las bibliotecas necesarias:


import requests
from lxml.html import fromstring
import csv

A continuación, defina una lista de URL de las páginas de hoteles de las que desea extraer datos:


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

Paso 2. Configurar las cabeceras de las peticiones

Para asegurarse de que sus peticiones imitan las de un navegador real, es crucial configurar correctamente las cabeceras. Este paso ayuda a eludir los sistemas de protección anti-bot de los sitios web y minimiza el riesgo de ser bloqueado.


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

Paso 3. Usar proxies

Los proxies pueden ayudar a eludir las restricciones basadas en IP. En el siguiente ejemplo, utilizamos un proxy con autenticación de dirección IP. A continuación se explica cómo añadir un proxy a las solicitudes.


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

Paso 4. Envío de peticiones y análisis sintáctico del HTML

Para cada URL, envíe una solicitud y analice la respuesta HTML:


extracted_data = []
for url in urls_list:
    response = requests.get(url, headers=headers)  # Añadir proxies=proxies si es necesario
    parser = fromstring(response.text)

Paso 5. Extracción de datos mediante XPath

Utilizando XPath, podemos dirigirnos a elementos específicos de la página:


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

Paso 6. Almacenar los datos extraídos

Almacena la información extraída en un diccionario y añádela a una lista:


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)

Paso 7. Guardar los datos en CSV Guardar datos en CSV

Tras el scraping, guarda los datos en un archivo 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)

Código completo


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

Esta guía no sólo sienta las bases técnicas para el scraping de datos, sino que también abre vías para un análisis exhaustivo en el sector turístico. Los métodos y técnicas que aquí se detallan permiten a los usuarios profundizar en las tendencias del mercado y los comportamientos de los consumidores. Estos conocimientos son cruciales para desarrollar estrategias sólidas de gestión de la reputación y realizar análisis competitivos. Gracias a esta guía, los usuarios pueden comprender mejor la dinámica del sector turístico, lo que les permite tomar decisiones estratégicas con conocimiento de causa para alcanzar el éxito.

Comentarios:

0 Comentarios