Como extrair dados do TripAdvisor usando Python

Comentários: 0

O TripAdvisor é um portal de viagens muito utilizado onde os utilizadores escrevem comentários sobre alojamento, refeições, visitas turísticas, etc. Enriquecer os dados com as avaliações do TripAdvisor pode ser útil para a análise de viagens, estudos de concorrência, etc. Neste guia, vamos abordar a forma como os dados do TripAdvisor podem ser extraídos utilizando python e os dados armazenados num formato csv.

Instalação das bibliotecas necessárias

Para construir este scraper, vamos usar as seguintes bibliotecas Python:

  • requests: Para construir este scraper, vamos usar as seguintes bibliotecas Python:
  • lxml: Para analisar o conteúdo HTML e extrair elementos com XPath.

Instale as bibliotecas necessárias usando pip:


pip install requests lxml

O papel dos cabeçalhos e dos proxies na extração eficaz de dados

Ao extrair dados de sites como o TripAdvisor, é crucial configurar corretamente os cabeçalhos de pedido, especialmente o User-Agent. Ao definir este cabeçalho, pode disfarçar os seus pedidos como se fossem provenientes de utilizadores legítimos, o que minimiza o risco de as suas actividades de recolha de dados desencadearem bloqueios devido a padrões de tráfego invulgares. Além disso, a utilização de servidores proxy é essencial para contornar restrições relacionadas com o número de pedidos permitidos a partir de um único endereço IP, facilitando assim esforços de recolha de dados mais extensos.

Guia passo-a-passo para raspar o TripAdvisor

Vamos percorrer o processo de recolha de uma lista de páginas de hotéis, extrair detalhes e guardá-los num ficheiro CSV. Vamos analisar cada parte.

Passo 1. Importar bibliotecas e configurar URLs

Para começar, importe as bibliotecas necessárias:


import requests
from lxml.html import fromstring
import csv

Em seguida, defina uma lista de URLs para as páginas de hotel das quais pretende extrair dados:


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

Passo 2. Definir cabeçalhos para pedidos

Para garantir que os seus pedidos imitam os de um navegador real, é crucial configurar corretamente os cabeçalhos. Este passo ajuda a contornar os sistemas de proteção anti-bot nos sítios Web e minimiza o risco 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',
}

Passo 3. Utilizar proxies

Os proxies podem ajudar a contornar as restrições baseadas no IP. No exemplo abaixo, usamos um proxy com autenticação de endereço IP. Veja como adicionar um proxy às solicitações.


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

Passo 4. Envio de pedidos e análise do HTML

Para cada URL, envie um pedido e analise o HTML de resposta:


extracted_data = []
for url in urls_list:
    response = requests.get(url, headers=headers)  # Adicionar proxies=proxies se necessário
    parser = fromstring(response.text)

Step 5. Extracting data using XPath

Utilizando XPath, podemos direcionar elementos específicos na 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')

Passo 6. Armazenar os dados extraídos

Armazenar as informações extraídas num dicionário e anexá-las a uma 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)

Passo 7. Guardar dados em CSV

Após a recolha, guarde os dados num ficheiro 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')

Este guia não só estabelece uma base técnica para a recolha de dados, como também abre caminhos para uma análise abrangente no sector do turismo. Os métodos e técnicas aqui descritos permitem aos utilizadores aprofundar as tendências do mercado e os comportamentos dos consumidores. Estes conhecimentos são cruciais para desenvolver estratégias sólidas de gestão da reputação e efetuar análises da concorrência. Ao utilizar este guia, os utilizadores podem melhorar a sua compreensão da dinâmica da indústria do turismo, tornando possível a tomada de decisões estratégicas informadas que conduzam ao sucesso.

Comentários:

0 Comentários