Como recolher dados do Yelp utilizando Python

Comentários: 0

A extração de dados do Yelp pode fornecer informações valiosas sobre restaurantes locais, incluindo detalhes como nome, URL, cozinhas e classificações. Usando as bibliotecas Python requests e lxml, este tutorial mostrará como extrair resultados de pesquisa do Yelp. Várias técnicas serão abordadas, incluindo o uso de proxies, manipulação de cabeçalhos e extração de dados com XPath.

Passo 1: Configurando o ambiente

Antes de iniciar o processo de raspagem, certifique-se de ter o Python instalado e as bibliotecas necessárias:

pip install requests
pip install lxml

Essas bibliotecas nos ajudarão a enviar solicitações HTTP para o Yelp, analisar o conteúdo HTML e extrair os dados de que precisamos.

Passo 2: Enviando uma solicitação ao Yelp

Primeiro, precisamos enviar uma solicitação GET para a página de resultados de pesquisa do Yelp para buscar o conteúdo HTML. Veja como fazer isso:

import requests

# URL da página de pesquisa do Yelp
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# Enviar um pedido GET para ir buscar o conteúdo HTML
response = requests.get(url)

# Verificar se o pedido foi bem sucedido
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

Compreender os cabeçalhos HTTP

Ao efetuar pedidos a um sítio Web, é essencial incluir os cabeçalhos HTTP adequados. Os cabeçalhos podem conter metadados sobre o pedido, como o agente do utilizador, que identifica o browser ou a ferramenta que faz o pedido. A inclusão desses cabeçalhos pode ajudar a evitar o bloqueio ou a limitação pelo site de destino.

Veja como você pode configurar cabeçalhos:

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',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    '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/127.0.0.0 Safari/537.36',
}

response = requests.get(url, headers=headers)

Implementando a rotação do proxy

Quando se faz scraping de um grande volume de páginas, existe o risco de o seu endereço IP ser bloqueado pelo sítio de destino. Para evitar isso, recomenda-se o uso de servidores proxy. Para este guia, é aconselhável usar servidores proxy dinâmicos que apresentam rotação automática. Desta forma, só precisa de definir as definições do servidor proxy uma vez, e a rotação ajudará a manter o acesso, alterando periodicamente o endereço IP, reduzindo a probabilidade de ser bloqueado.

proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

response = requests.get(url, headers=headers, proxies=proxies)

Passo 3: Analisando o conteúdo HTML com lxml

Assim que tivermos o conteúdo HTML, o próximo passo é analisá-lo e extrair os dados relevantes. Para isso, usaremos a biblioteca lxml.

from lxml import html

# Analisar o conteúdo HTML utilizando lxml
parser = html.fromstring(response.content)

Identificando os elementos a serem extraídos

Precisamos de visar as listagens individuais de restaurantes na página de resultados da pesquisa. Esses elementos podem ser identificados usando expressões XPath. No caso do Yelp, as listagens geralmente são agrupadas em um elemento div com um atributo data-testid específico.

# Extrair elementos individuais do restaurante
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

Utilização do XPath para extração de dados

O XPath é uma ferramenta poderosa para navegar e selecionar nós de um documento HTML. Neste tutorial, usaremos expressões XPath para extrair o nome do restaurante, o URL, as cozinhas e a classificação de cada elemento do restaurante.

Aqui estão os XPaths específicos para cada ponto de dados:

  1. Nome do restaurante: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()
  2. URL do restaurante: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href
  3. Cozinhas: .//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()
  4. Classificação: .//div[@class="y-css-9tnml4"]/@aria-label

Passo 4: Extrair dados de cada listagem de restaurantes

Agora que temos o conteúdo HTML e lidamos com o possível bloqueio de IP, podemos extrair os dados necessários de cada listagem de restaurante.

restaurants_data = []

# Iterar sobre cada elemento do restaurante
for element in elements:
    # Extrair o nome do restaurante
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Extrair o URL do restaurante
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Extrair as cozinhas
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Extrair a classificação
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Criar um dicionário para armazenar os dados
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Adicionar a informação do restaurante à lista
    restaurants_data.append(restaurant_info)

Passo 5: Salvando os dados como JSON

Depois de extrair os dados, precisamos salvá-los em um formato estruturado. O JSON é um formato amplamente usado para essa finalidade.

import json

# Guardar os dados num ficheiro JSON
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Código completo

import requests
from lxml import html
import json

# URL da página de pesquisa do Yelp
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# Configurar cabeçalhos para imitar um pedido do browser
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.5'
}

# Configurar proxies, se necessário
proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

# Send a GET request to fetch the HTML content
response = requests.get(url, headers=headers, proxies=proxies)

# Check if the request was successful
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

# Analisar o conteúdo HTML utilizando lxml
parser = html.fromstring(response.content)

# Extrair elementos individuais do restaurante
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

# Inicializar uma lista para guardar os dados extraídos
restaurants_data = []

# Iterar sobre cada elemento do restaurante
for element in elements:
    # Extrair o nome do restaurante
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Extrair o URL do restaurante
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Extrair as cozinhas
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Extrair a classificação
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Criar um dicionário para armazenar os dados
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Adicionar a informação do restaurante à lista
    restaurants_data.append(restaurant_info)

# Guardar os dados num ficheiro JSON
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

É crucial que os utilizadores configurem corretamente os cabeçalhos HTTP e utilizem proxies para contornar as restrições e evitar o bloqueio. Para uma experiência de raspagem optimizada e mais segura, considere a automatização da rotação de IP. A utilização de proxies residenciais dinâmicos ou móveis pode melhorar significativamente este processo, reduzindo a probabilidade de ser detectado e bloqueado.

Comentários:

0 Comentários