Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

0
respostas

[Projeto] [Projeto] Faça como eu fiz: Busca agêntica e scraping parte 3

from bs4 import BeautifulSoup

# usa a variavel da celula acima que simula uma pagina html carregade de webscrap

soup_tripadvisor = BeautifulSoup(html_do_tripadvisor, 'html.parser')

print("\nIniciando a extração detalhada dos restaurantes da página do Tripadvisor...")
restaurantes_detalhados = [] 

restaurant_blocks = soup_tripadvisor.find_all('div', class_=lambda c: c and 'tbrcR' in c)

if not restaurant_blocks:
    print("AVISO: Nenhum bloco de restaurante principal encontrado com os seletores configurados ('tbrcR').")
    print("Por favor, **REVISE A INSPEÇÃO MANUAL** se o layout da página mudou e atualize este seletor.")

top_n_restaurants = restaurant_blocks[:5] 

for block in top_n_restaurants:

    nome_link_tag = block.find('a', class_=lambda c: c and 'BMQDV' in c and 'ukgoS' in c)
    nome = "Nome não encontrado"
    if nome_link_tag:
        nome_div_tag = nome_link_tag.find('div', class_=lambda c: c and 'biGQs' in c and 'fiohW' in c)
        if nome_div_tag:
            nome = nome_div_tag.get_text(strip=True)

    reviews_tag = block.find('div', {'data-automation': 'bubbleReviewCount'})
    reviews = reviews_tag.find('span').get_text(strip=True) if reviews_tag and reviews_tag.find('span') else "Reviews não encontrados"


    rating_tag = block.find('div', {'data-automation': 'bubbleRatingValue'})
    rating = rating_tag.find('span').get_text(strip=True) if rating_tag and rating_tag.find('span') else "Avaliação não encontrada"


    culinaria_preco_div = block.find('div', class_=lambda c: c and 'ZvrsW' in c and 'biqBm' in c)

    tipo_culinaria = "Tipo de Culinária não encontrado"
    preco = "Preço não encontrado"

    if culinaria_preco_div:

        spans_info = culinaria_preco_div.find_all('span', class_=lambda c: c and 'biGQs' in c and 'pZUbB' in c and 'ZNjnF' in c)


        if len(spans_info) >= 1:

            tipo_culinaria = spans_info[0].get_text(strip=True)


            for i in range(1, len(spans_info)):
                text = spans_info[i].get_text(strip=True)
                if '$' in text: 
                    preco = text
                    break 


    localizacao = "Localização não especificada (do nome)"
    if ' - ' in nome:

        partes_nome = nome.split(' - ')
        if len(partes_nome) > 1:
            localizacao = partes_nome[-1].strip()


    link = "Link não encontrado"
    if nome_link_tag and 'href' in nome_link_tag.attrs:
        link = "https://www.tripadvisor.com.br" + nome_link_tag['href']


    restaurantes_detalhados.append({
        "Nome": nome,
        "Avaliação": rating,
        "Reviews": reviews,
        "Preço": preco,
        "Tipo Culinária": tipo_culinaria,
        "Localização": localizacao,
        "Link": link
    })


if restaurantes_detalhados:
    print(f"\n--- {len(restaurantes_detalhados)} Restaurantes Extraídos do Tripadvisor ---")
    for i, r in enumerate(restaurantes_detalhados):
        print(f"Restaurante #{i+1}:")
        print(f"  Nome: {r['Nome']}")
        print(f"  Avaliação: {r['Avaliação']}")
        print(f"  Reviews: {r['Reviews']}")
        print(f"  Preço: {r['Preço']}")
        print(f"  Tipo Culinária: {r['Tipo Culinária']}")
        print(f"  Localização: {r['Localização']}")
        print(f"  Link: {r['Link']}")
        print("-" * 40)
else:
    print("Nenhum detalhe de restaurante foi extraído. **Verifique os seletores HTML no Bloco 4**.")

print("-" * 50)