1
resposta

[Dúvida] Busca agêntica e scraping

1 Instalação de Pacotes
pip install tavily-python duckduckgo-search selenium beautifulsoup4 python-dotenv

2 Configuração de Variáveis ​​de Ambiente (.env)
TAVILY_API_KEY=SUA_CHAVE_AQUI

Carregando nenhum código:

import os
from dotenv import load_dotenv

load_dotenv()
TAVILY_API_KEY = os.getenv("TAVILY_API_KEY")

3 Busca Regular com DuckDuckGo
from duckduckgo_search import DDGS

def busca_regular_restaurantes(cidade):
resultados = []
with DDGS() as ddgs:
for r in ddgs.text(f"melhores restaurantes em {cidade}", max_results=5):
resultados.append(r["href"])
return resultados

links = busca_regular_restaurantes("São Paulo")
print("Links encontrados:")
for link in links:
print(link)

URLs.

4 Busca Agência com Tavily

Agora o agente decide qual link do TripAdvisor é mais relevante.

from tavily import TavilyClient

tavily = TavilyClient(api_key=TAVILY_API_KEY)

def busca_agentica_tripadvisor(cidade):
resposta = tavily.search(
query=f"melhores restaurantes em {cidade} TripAdvisor",
search_depth="advanced",
max_results=5
)

for resultado in resposta["results"]:
    if "tripadvisor" in resultado["url"]:
        return resultado["url"]

url_tripadvisor = busca_agentica_tripadvisor("São Paulo")
print("URL escolhida pelo agente:")
print(url_tripadvisor)

sistema:

Pesquisa

Filtra

Escolhe automaticamente

Isso busca caracterizar a agência .

5 Web Scraping com Selenium + BeautifulSoup

Antes, instale o ChromeDriver compatível com seu navegador.

Inicializando o Selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

def extrair_dados_restaurantes(url):
options = Options()
options.add_argument("--headless") # Executa sem abrir navegador
driver = webdriver.Chrome(options=options)

driver.get(url)
time.sleep(5)  # Aguarda carregamento dinâmico

soup = BeautifulSoup(driver.page_source, "html.parser")

restaurantes = []

cards = soup.find_all("div", class_="some-card-class")  # ajustar para site real

for card in cards:
    nome = card.find("span", class_="nome").text if card.find("span", class_="nome") else "N/A"
    avaliacao = card.find("span", class_="avaliacao").text if card.find("span", class_="avaliacao") else "N/A"
    tipo = card.find("span", class_="tipo").text if card.find("span", class_="tipo") else "N/A"
    preco = card.find("span", class_="preco").text if card.find("span", class_="preco") else "N/A"

    restaurantes.append({
        "nome": nome,
        "avaliacao": avaliacao,
        "tipo": tipo,
        "preco": preco
    })

driver.quit()
return restaurantes

6 Executando Pipeline Completo
cidade = "São Paulo"

1️ Busca regular

print("Busca regular:")
print(busca_regular_restaurantes(cidade))

2️ Busca agêntica

url = busca_agentica_tripadvisor(cidade)
print("URL selecionada:", url)

3️ Scraping

dados = extrair_dados_restaurantes(url)
print("Dados extraídos:")
for r in dados:
print(r)

1 resposta

Oii, Moacir.

A sua atividade mostra um domínio bem legal da lógica de automação. O destaque aqui é como você separou as responsabilidades: deixou o Tavily com a parte de "pensar" e selecionar o melhor caminho, enquanto o Selenium e o BeautifulSoup ficaram com o trabalho pesado de extração.

  • No passo 4, a lógica de filtrar especificamente por "tripadvisor" dentro dos resultados do Tavily é uma ótima forma de garantir que o scraper receba o formato de página que ele já espera processar.
  • O uso de condicionais para definir "N/A" é o que evita que o código quebre em páginas com informações incompletas. Isso é o que diferencia um script iniciante de um código que roda sem supervisão.
  • O uso do .env para gerenciar chaves de API é uma prática indispensável de segurança que você aplicou corretamente.

Mandou muito bem na organização do pipeline.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!