Ir para o conteúdo

Como fazer Web Scrape Yelp.com: o guia definitivo de 3000 palavras para extrair listagens de empresas, avaliações e outros dados

O Yelp é uma das maiores plataformas de avaliação coletiva da web. Com mais de 200 milhões de avaliações de restaurantes, bares, salões de beleza, lojas e outras empresas em mais de 30 países, contém uma mina de ouro de dados para analistas, pesquisadores, empreendedores e muito mais.

Mas é possível extrair esses dados por meio de web scraping? Absolutamente!

Neste guia abrangente de mais de 3000 palavras, compartilharei tudo que você precisa para construir um web scraper que pode extrair enormes conjuntos de dados do Yelp usando Python.

Aqui está um resumo rápido do que abordaremos:

  • Configurando nosso ambiente de web scraping em Python
  • Encontrar e extrair todas as empresas que correspondem a uma consulta de pesquisa
  • Extrair detalhes importantes, como nome, endereço e números de telefone das páginas de perfil da empresa
  • Extrair todos os comentários de uma empresa, incluindo classificações, detalhes do usuário, etc.
  • Evitando a detecção de bots por meio de proxies, atrasos e outros truques

Então aperte o cinto e vamos começar a raspar!

Configurando um ambiente de web scraping em Python

Antes de podermos raspar o Yelp, precisamos configurar um ambiente Python com as dependências necessárias.

Existem alguns pacotes principais que precisamos instalar:

pedidos – para enviar solicitações HTTP aos servidores do Yelp

Linda Sopa – para analisar e extrair dados das páginas HTML do Yelp

Escamoso – (opcional) uma estrutura para construir raspadores

Eu recomendo criar um ambiente virtual antes de instalar estes:

python -m venv scraping-env
source scraping-env/bin/activate

Agora podemos instalar os pacotes:

pip install requests beautifulsoup4 scrapy

É isso para dependências. Também precisamos de cabeçalhos válidos para que os servidores do Yelp pensem que nossas solicitações vêm de um navegador real:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}

A chave é definir um cenário convincente User-Agent cabeçalho. Eu recomendo alternar vários agentes de usuário do navegador para imitar ainda mais o tráfego real.

E estamos prontos para começar a raspar!

Encontrando empresas no Yelp

Nosso primeiro desafio é descobrir URLs de perfis de negócios do Yelp para extrair. O Yelp não fornece uma API pública ou mapa do site que possamos consultar para isso.

Portanto, teremos que fazer engenharia reversa em sua funcionalidade de pesquisa para encontrar empresas que correspondam a um termo ou local de pesquisa.

Vamos analisar uma consulta de pesquisa típica:

https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco

Isso retorna um conjunto paginado de empresas que correspondem aos nossos critérios de pesquisa. Cada página contém 10 listagens de empresas.

Para extrair TODOS os negócios correspondentes, precisamos:

  1. Busque a primeira página para obter a contagem total de negócios
  2. Itere por todas as páginas incrementando o start parâmetro

Aqui está como podemos implementar esta lógica de paginação em Python:

import requests
from urllib.parse import urlencode
from bs4 import BeautifulSoup

search_url = "https://www.yelp.com/search?"

params = {
  "find_desc": "restaurants",
  "find_loc": "San Francisco"  
}

search_url += urlencode(params)

print("Fetching first page")
first_page = requests.get(search_url, headers=headers)
soup = BeautifulSoup(first_page.content, "html.parser")

businesses = soup.select(".businessName") 
total = int(soup.select_one(".pagination-results-window").text.split()[0].replace(‘,‘, ‘‘))
print(f"Found {total} businesses")

# Calculate pages needed to cover all businesses
num_pages = math.ceil(total / 10)

print(f"Scraping {num_pages} pages...")

for page in range(0, num_pages):

  # Update start param 
  params["start"] = page * 10
  page_url = search_url + "&" + urlencode(params)

  # Fetch page
  print(f"Page {page+1}/{num_pages}")
  page = requests.get(page_url, headers=headers)

  # Extract businesses
  page_soup = BeautifulSoup(page.content, "html.parser")
  businesses.extend(page_soup.select(".businessName"))

print(f"Found {len(businesses)} businesses!")

Vamos decompô-lo:

  • Começamos com o URL de pesquisa base e os parâmetros de pesquisa
  • Busque a primeira página para obter a contagem total de negócios
  • Calcule o número de páginas necessárias para cobrir todos os negócios
  • Iterar pelas páginas atualizando o start param
  • Em cada página, extraia listagens de empresas e anexe à lista principal

No meu teste isso foi extraído 6,000 listas de restaurantes em São Francisco – nada mal para 30 linhas de Python!

Com alguns ajustes extras, você pode transformar isso em um raspador de negócios do Yelp para uma cidade ou país inteiro.

Raspar páginas de perfil de empresa

Agora que podemos descobrir URLs de perfis de negócios, nossa próxima etapa é visitar cada um deles e extrair detalhes importantes como:

  • Nome
  • Endereço
  • Telefone
  • Horário de funcionamento
  • Descrição
  • Fotos
  • E mais…

As páginas comerciais do Yelp são renderizadas dinamicamente, mas o HTML subjacente é simples o suficiente para ser analisado com o BeautifulSoup.

Vejamos um trecho de exemplo:



<p>
  <strong>Phone:</strong> 
  415-387-2147
</p>

<p>
  <strong>Address:</strong>
  1345 9th Ave, San Francisco, CA 94122
</p>

<!-- And so on... -->

Podemos extrair cada informação com alguns seletores CSS bem posicionados:

from bs4 import BeautifulSoup
import requests

business_url = "https://www.yelp.com/biz/burma-superstar-san-francisco"

page = requests.get(business_url, headers=headers)
soup = BeautifulSoup(page.content, "html.parser")

name = soup.select_one("h1").text
phone = soup.find("strong", string="Phone:").next_sibling.strip() 
address = soup.find("strong", string="Address:").next_sibling.strip()

hours = {}
for day in soup.select(".day-hours"):
   day_name = day.select_one(".day-name").text
   hours[day_name] = day.select_one(".hours").text

print(name)
print(phone) 
print(address)
print(hours)

# Burma Superstar
# 415-387-2147
# 1345 9th Ave, San Francisco, CA 94122
# {‘Mon‘: ‘11:30am–3pm, 5–9:30pm‘, ‘Tue‘: ‘11:30am–3pm, 5–9:30pm‘...}

Os pontos principais são:

  • Use select_one para extrair elementos singulares como nome, telefone etc.
  • Para dados aninhados, como horas, faça um loop e crie um dicionário
  • Prefixe seletores CSS com tags e classes para exclusividade

Com esses blocos de construção de raspagem, podemos extrair dezenas de campos de cada página de perfil em um dicionário Python estruturado ou objeto JSON.

Alguns outros campos que você pode querer considerar a raspagem incluem:

  • Tags de categoria como 'Mexicano', 'Brunch' etc.
  • Etiquetas de culinária como 'Burger', 'Sushi', 'Café' etc.
  • Medidas de segurança COVID
  • Faixa de preço
  • Área Ex: "Parque das Nações"
  • latitude longitude
  • E mais…

Ser criativo aqui permite que você crie extensos conjuntos de dados do Yelp com centenas de campos para analisar, se necessário.

Extraindo comentários das páginas comerciais do Yelp

As avaliações são as joias da coroa dos dados do Yelp. Eles fornecem insights incríveis sobre o sentimento do consumidor, tendências, dados demográficos e muito mais.

Infelizmente, as avaliações não são carregadas diretamente no HTML. Eles são buscados dinamicamente por meio de chamadas JavaScript.

Precisaremos interceptar e imitar essas solicitações para extrair dados de revisão.

Vamos abrir uma página comercial e monitorar as solicitações de rede nas ferramentas do navegador:

Yelp analisa solicitação de rede

Aha – podemos ver que os comentários são carregados de um URL como:

https://www.yelp.com/biz/{business_id}/reviews

Onde {business_id} é único para cada negócio. Podemos extraí-lo do HTML da página comercial.

As resenhas são paginadas por meio do start parâmetro. Então seguiremos a mesma estratégia de paginação:

  1. Busque a primeira página para obter a contagem total de avaliações
  2. Iterar por todas as páginas incrementando start

Aqui está um script para extrair todos os comentários de uma empresa:

import json
import requests 

business_id = "WavvLdfdP6g8aZTtbBQHTw" # Extract this from HTML

review_url = f"https://www.yelp.com/biz/{business_id}/review_feed?rl=en&q=&sort_by=relevance_desc"

print("Fetching first page")
first_page = requests.get(review_url, headers=headers)
data = json.loads(first_page.text)

total = data["pagination"]["totalResults"]
print(f"Found {total} reviews")

reviews = data["reviews"]

for page in range(total//20 + 1): # 20 reviews per page

  print(f"Fetching page {page+1}/{math.ceil(total/20)}")
  next_page = f"{review_url}&start={page*20}"
  page_data = requests.get(next_page, headers=headers).json()

  reviews.extend(page_data["reviews"])

print(f"Scraped {len(reviews)} reviews!")

Estrondo! Agora temos o corpus completo da revisão de uma empresa com dados como:

{
   "id": "xAG4O7l-t1ubiIsO4cXMYg",
   "rating": 5,
   "user": {
      "id": "rpOyqD_893cqmDAtJLbdog",
      "profile_url": "https://www.yelp.com/user_details?userid=rpOyqD_893cqmDAtJLbdog",
      "name": "Sarah K.",
      "location": "Los Angeles, CA", 
      //...
   },
   "text": "This place is incredible! The sushi melts in your mouth and the...",
    //...
}

A análise desses dados pode fornecer sinais fortes sobre o sentimento do cliente em diferentes locais, dados demográficos, tipos de culinária e muito mais.

Evitando a detecção de bots

Agora que criamos scrapers para empresas e avaliações, é hora de juntar tudo.

Um problema: se começarmos a sobrecarregar os servidores do Yelp com milhares de solicitações, seremos rapidamente bloqueados.

O Yelp emprega sistemas avançados de detecção de bots para evitar abusos, incluindo:

  • Limites de uso – limite a rapidez com que você pode solicitar páginas
  • CAPTCHAs – desafie os usuários a verificar se são humanos
  • Proibições de IP – bloquear endereços IP abusivos

Aqui estão algumas dicas para evitar bloqueios ao raspar o Yelp em grande escala:

Usar Proxies

Ao rotear o tráfego através de um grande conjunto de IPs residenciais, podemos mascarar scrapers e evitar proibições fáceis de IP.

Veja como usar proxies com o módulo Solicitações:

from proxy_list import proxies 

# Rotate proxy per request
proxy = random.choice(proxies)

requests.get(url, headers=headers, proxies={"http": proxy, "https": proxy}) 

Eu recomendo ter uma piscina de pelo menos 10,000 proxies de diferentes intervalos de IP sejam seguros.

Adicionar atrasos aleatórios

Adicionar atrasos variados entre as solicitações ajuda a imitar o comportamento humano orgânico:

from random import randint

# Add random delay between 2s and 6s
time.sleep(randint(2, 6))

Apontar para uma média de segundo 3-5 entre páginas. Qualquer velocidade mais rápida levantará bandeiras vermelhas.

Use um navegador sem cabeça

Para aumentar o anonimato, você pode usar um navegador headless como o Selenium para renderizar JavaScript e ignorar proteções.

Apenas certifique-se de alterar a impressão digital e o proxy do navegador por sessão.

Resolva CAPTCHAs com 2Captcha

Se você acertar um CAPTCHA, serviços como o 2Captcha podem resolvê-los automaticamente para continuar a raspagem.

A maioria dos serviços cobra cerca de US$ 2 por 1000 CAPTCHAs resolvidos, o que vale a pena escalar grandes scrapers.

Respeite as limitações da conta

Fique de olho na página de status da sua conta. Se sua taxa de raspagem for muito agressiva, o Yelp poderá impor limites de uso temporários.

Acompanhe suas solicitações e recue se erros indicarem que você está se aproximando do limite de uso.

Raspando o Yelp: Próximas etapas

E isso abrange as principais técnicas para extrair listagens, perfis e avaliações de empresas do Yelp!

Os dados que você pode extrair abrem inúmeras possibilidades:

  • Analise o sentimento do consumidor em todos os dados demográficos
  • Acompanhe tendências e tipos de culinária emergentes
  • Crie modelos preditivos para fatores de sucesso empresarial
  • Otimize seu próprio SEO e reputação
  • Realize uma ampla pesquisa de mercado
  • Identifique oportunidades de publicidade

Apenas lembre-se de obedecer aos Termos de Serviço do Yelp, limitar o volume de solicitações e evitar extrair quaisquer dados privados do usuário.

Espero que você tenha achado este guia útil! Sinta-se à vontade para entrar em contato se tiver outras dúvidas.

Boa raspagem!

Tags:

Junte-se à conversa

O seu endereço de e-mail não será publicado. Os campos obrigatórios são marcados com *