Web Scraping com LLaMA 3: Transforme qualquer site em JSON estruturado (Guia 2025)

Use o LLaMA 3 para converter HTML grande em JSON estruturado e evitar os obstáculos comuns de raspagem.
19 min de leitura
Web scraping with Llama blog image

Os métodos tradicionais de raspagem da Web geralmente quebram quando os layouts dos sites mudam ou as proteções anti-bot ficam mais rígidas. Neste guia, você aprenderá uma abordagem mais resiliente e alimentada por IA usando o LLaMA 3 –o poderoso modelo de linguagem de peso aberto do Meta – para extrair dados estruturados de praticamente qualquer site e convertê-los em JSON limpo e utilizável.

Vamos começar.

Por que usar o LLaMA 3 para raspagem da Web?

O LLaMA 3 (lançado em abril de 2024) é o modelo de linguagem grande e aberta do Meta, disponível em tamanhos que variam de 8B a 405B parâmetros. Ele oferece suporte a uma ampla variedade de casos de uso e capacidades de hardware. As iterações subsequentes – LLaMA 3.1, 3.2 e 3.3 – melhoraram significativamente o desempenho e a compreensão contextual.

Os métodos tradicionais de raspagem da Web dependem de seletores estáticos, como XPath ou CSS, que podem quebrar facilmente quando as estruturas do site mudam. Por outro lado, o LLaMA 3 permite a extração inteligente de dados, compreendendo o conteúdo contextualmente – exatamente como um ser humano faria.

Isso o torna ideal para:

  • Sites de comércio eletrônico como a Amazon
  • análise de dados
  • Criação de raspadores mais resistentes que não sejam interrompidos a cada atualização do site
  • Manter os dados extraídos em seu ambiente – crucial para informações confidenciais

Saiba mais sobre o uso de IA para raspagem da Web.

Pré-requisitos

Antes de mergulhar na raspagem da Web do LLM, verifique se você tem os seguintes itens:

  • Python 3 instalado
  • Conhecimento básico de Python (não é necessário ser um especialista)
  • Um sistema operacional compatível: – macOS (requer macOS 11 Big Sur ou posterior) – Linux – Windows (requer Windows 10 ou posterior)
  • Recursos de hardware adequados (consulte os detalhes de seleção de modelos abaixo)

Instalação do Ollama

O Ollama é uma ferramenta leve que simplifica o download, a configuração e a execução de grandes modelos de linguagem localmente.

ollama-llm-download-installation-page

Para começar:

  1. Visite o site oficial da Ollama
  2. Faça o download e instale o aplicativo para seu sistema operacional
  3. Importante: Durante a instalação, o Ollama solicitará que você execute um comando de terminal –não o execute ainda. Primeiro, escolheremos a versão correta do modelo.

Escolhendo seu modelo de LLaMA

Comece navegando na biblioteca de modelos da Ollama para escolher a versão do LLaMA que melhor se adapta ao seu hardware e caso de uso.

Para a maioria dos usuários, o llama3.1:8b oferece o melhor equilíbrio entre desempenho e eficiência. Ele é leve, capaz e requer aproximadamente 4,9 GB de espaço em disco e de 6 a 8 GB de RAM. Ele funciona sem problemas na maioria dos laptops modernos.

Se estiver trabalhando com uma máquina mais potente e precisar de mais recursos de raciocínio ou de um comprimento de contexto estendido, considere a possibilidade de aumentar a escala para modelos maiores, como 70B ou 405B. Esses modelos exigem muito mais memória e potência de computação.

Extração e execução do modelo

Para fazer download e inicializar o modelo LLaMA 3.1 (8B), execute o seguinte comando:

ollama run llama3.1:8b

Depois que o modelo for baixado, você verá um prompt interativo simples:

>>> Send a message (/? for help)

Você pode testar o modelo com uma consulta rápida:

>>> who are you?
I am LLaMA, *an AI assistant developed by Meta AI...*

Uma resposta bem-sucedida como a acima confirma que o modelo está instalado corretamente. Digite /bye para sair do prompt.

Em seguida, inicie o servidor Ollama executando:

ollama serve

Esse comando inicia uma instância local do Ollama em http://127.0.0.1:11434/. Deixe essa janela de terminal aberta, pois o servidor deve permanecer em execução em segundo plano.

Para verificar se está funcionando, abra o navegador e acesse esse URL – você deverá ver a mensagem “Ollama is running”.

Criação do Amazon Scraper com LLM

Nesta seção, criaremos um scraper que extrai detalhes de produtos da Amazon, um dos alvos mais desafiadores devido ao seu conteúdo dinâmico e às fortes proteções antibot.

página de produto da cadeira de escritório da amazon

Extrairemos detalhes importantes, como:

  • Título do produto
  • Preço atual/original
  • Desconto
  • Classificação e resenhas
  • Descrição e recursos
  • Disponibilidade e ASIN

O fluxo de trabalho de vários estágios com tecnologia de IA

Para superar as limitações da raspagem tradicional – especialmente em sites complexos de comércio eletrônico, como a Amazon – nosso raspador com tecnologia LLaMA segue um fluxo de trabalho inteligente e de várias etapas:

  1. Automação do navegador – Use o Selenium para carregar a página e renderizar o conteúdo dinâmico
  2. Extração de HTML – Identifique e extraia o contêiner que inclui os detalhes do produto
  3. Conversão de Markdown – Converta o HTML em Markdown para reduzir a contagem de tokens e melhorar a eficiência do LLM
  4. Processamento LLM – Use um prompt estruturado com o LLaMA para extrair JSON limpo e estruturado
  5. Tratamento de saída – Armazene o JSON extraído para uso ou análise posterior

Aqui está um detalhamento visual do fluxo de trabalho:

Vamos agora percorrer o processo passo a passo. Observe que esses exemplos usam Python por sua simplicidade e popularidade, mas você pode obter resultados semelhantes usando JavaScript ou outra linguagem de sua escolha.

Etapa 1 – Instalar as bibliotecas necessárias

Primeiro, instale as bibliotecas Python necessárias:

pip install requests selenium webdriver-manager markdownify
  • requestsO melhor cliente HTTP Python para enviar chamadas de API para o serviço LLM
  • selenium – Automatiza o navegador, ideal para sites com muito JavaScript
  • webdriver-manager – Faz o download e gerencia automaticamente a versão correta do ChromeDriver
  • markdownify – Converte HTML em Markdown

Etapa 2 – Inicializar o navegador sem cabeça

Configure um navegador sem cabeça usando o Selenium:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager

options = Options()
options.add_argument("--headless")

driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    options=options
)

Etapa 3 – Extrair o HTML do produto

Os detalhes dos produtos da Amazon são renderizados dinamicamente e agrupados em um

contêiner. Aguardaremos o carregamento dessa seção e extrairemos seu HTML:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 15)
product_container = wait.until(
    EC.presence_of_element_located((By.ID, "ppd"))
)

# Extract the full HTML of the product container
page_html = product_container.get_attribute("outerHTML")

Essa abordagem:

  • Espera por conteúdo renderizado por JavaScript (como preços e classificações)
  • Direciona apenas a seção relevante do produto – ignorando cabeçalhos, rodapés e barras laterais

Confira nosso guia completo sobre como extrair dados de produtos da Amazon em Python.

Etapa 4 – Converter HTML em Markdown

As páginas da Amazon contêm HTML profundamente aninhado que é ineficiente para os LLMs processarem. Uma otimização importante é a conversão desse HTML em Markdown limpo, o que reduz drasticamente a contagem de tokens e melhora a compreensão.

Quando você executar o script completo, serão gerados dois arquivos: amazon_page.html e amazon_page.md. Tente colar ambos na ferramenta Token Calculator para comparar suas contagens de tokens.

Conforme mostrado abaixo, o HTML contém cerca de 270.000 tokens:

token-calculator-html-tokens

A versão Markdown? Apenas ~11.000 tokens:

token-calculator-markdown-tokens

Essa redução de 96% leva a:

  • Eficiência de custos – menos tokens significam custos menores de API ou computação
  • Processamento mais rápido – menos dados de entrada = respostas mais rápidas do LLM
  • Maior precisão – Um texto mais limpo e plano ajuda o modelo a extrair dados estruturados com mais precisão

Leia mais sobre por que os agentes de IA preferem Markdown a HTML.

Veja como fazer a conversão em Python:

from markdownify import markdownify as md

clean_text = md(page_html, heading_style="ATX")

Etapa 5 – Criar o prompt de extração de dados

Um prompt bem estruturado é essencial para obter uma saída JSON consistente e limpa do LLM. Abaixo está um prompt que instrui o modelo a retornar somente JSON válido em um formato predefinido:

PROMPT = (
    "You are an expert Amazon product data extractor. Your task is to extract product data from the provided content. "
    "Return ONLY valid JSON with EXACTLY the following fields and formats:\n\n"
    "{\n"
    '  "title": "string – the product title",\n'
    '  "price": number – the current price (numerical value only)",\n'
    '  "original_price": number or null – the original price if available,\n'
    '  "discount": number or null – the discount percentage if available,\n'
    '  "rating": number or null – the average rating (0–5 scale),\n'
    '  "review_count": number or null – total number of reviews,\n'
    '  "description": "string – main product description",\n'
    '  "features": ["string"] – list of bullet point features,\n'
    '  "availability": "string – stock status",\n'
    '  "asin": "string – 10-character Amazon ID"\n'
    "}\n\n"
    "Return ONLY the JSON without any additional text."
)

Etapa 6 – Chamar a API do LLM

Com o Ollama em execução local, você pode enviar o texto do Markdown para a instância do LLaMA por meio de sua API HTTP:

import requests
import json

response = requests.post(
    "<http://localhost:11434/api/generate>",
    json={
        "model": "llama3.1:8b",
        "prompt": f"{PROMPT}\n\n{clean_text}",
        "stream": False,
        "format": "json",
        "options": {
            "temperature": 0.1,
            "num_ctx": 12000,
        },
    },
    timeout=250,
)

raw_output = response.json()["response"].strip()
product_data = json.loads(raw_output)

O que cada opção faz:

  • temperatura – Defina como 0,1 para obter uma saída determinística (ideal para formatação JSON)
  • num_ctx – Define o comprimento máximo do contexto. 12.000 tokens são suficientes para a maioria das páginas de produtos da Amazon
  • stream – Quando False, a API retorna a resposta completa após o processamento
  • format – Especifica o formato de saída (JSON)
  • model – Indica a versão do LLaMA a ser usada

Como o Markdown convertido normalmente contém cerca de 11.000 tokens, é importante definir a janela de contexto(num_ctx) de acordo. Embora o aumento desse valor permita lidar com entradas mais longas, ele também aumenta o uso da RAM e torna o processamento mais lento. Aumente o limite de contexto somente se as páginas de seus produtos forem especialmente longas ou se você tiver os recursos de computação para suportá-lo.

Etapa 7 – Salvar os resultados

Por fim, salve os dados estruturados do produto em um arquivo JSON:

with open("product_data.json", "w", encoding="utf-8") as f:
    json.dump(product_data, f, indent=2, ensure_ascii=False)

Etapa 8: Executar o script

Para executar seu raspador, forneça um URL de produto da Amazon e chame sua função de raspagem:

if __name__ == "__main__":
    url = "<https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJAO>"

    # Call your function to scrape and extract product data
    scrape_amazon_product(url)

Etapa 9 – Exemplo de código completo

Abaixo está o script Python completo que combina todas as etapas em um fluxo de trabalho coeso e de ponta a ponta:

import json
import logging
import time
from typing import Final, Optional, Dict, Any

import requests
from markdownify import markdownify as html_to_md
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager

# Configuration constants
LLM_API_CONFIG: Final[Dict[str, Any]] = {
    "endpoint": "<http://localhost:11434/api/generate>",
    "model": "llama3.1:8b",
    "temperature": 0.1,
    "context_window": 12000,
    "stream": False,
    "timeout_seconds": 220,
}

DEFAULT_PRODUCT_DATA: Final[Dict[str, Any]] = {
    "title": "",
    "price": 0.0,
    "original_price": None,
    "discount": None,
    "rating": None,
    "review_count": None,
    "description": "",
    "features": [],
    "availability": "",
    "asin": "",
}

PRODUCT_DATA_EXTRACTION_PROMPT: Final[str] = (
    "You are an expert Amazon product data extractor. Your task is to extract product data from the provided content. "
    "Return ONLY valid JSON with EXACTLY the following fields and formats:\n\n"
    "{\n"
    '  "title": "string - the product title",\n'
    '  "price": number - the current price (numerical value only),\n'
    '  "original_price": number or null - the original price if available,\n'
    '  "discount": number or null - the discount percentage if available,\n'
    '  "rating": number or null - the average rating (0-5 scale),\n'
    '  "review_count": number or null - total number of reviews,\n'
    '  "description": "string - main product description",\n'
    '  "features": ["string"] - list of bullet point features,\n'
    '  "availability": "string - stock status",\n'
    '  "asin": "string - 10-character Amazon ID"\n'
    "}\n\n"
    "Return ONLY the JSON without any additional text."
)

# Configure logging
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    handlers=[logging.StreamHandler()],
)

def initialize_web_driver(headless: bool = True) -> webdriver.Chrome:
    """Initialize and return a configured Chrome WebDriver instance."""
    options = Options()
    if headless:
        options.add_argument("--headless=new")

    service = Service(ChromeDriverManager().install())
    return webdriver.Chrome(service=service, options=options)

def fetch_product_container_html(product_url: str) -> Optional[str]:
    """Retrieve the HTML content of the Amazon product details container."""
    driver = initialize_web_driver()
    try:
        logging.info(f"Accessing product page: {product_url}")
        driver.set_page_load_timeout(15)
        driver.get(product_url)

        # Wait for the product container to appear
        container = WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((By.ID, "ppd"))
        )
        return container.get_attribute("outerHTML")
    except Exception as e:
        logging.error(f"Error retrieving product details: {str(e)}")
        return None
    finally:
        driver.quit()

def extract_product_data_via_llm(markdown_content: str) -> Optional[Dict[str, Any]]:
    """Extract structured product data from markdown text using LLM API."""
    try:
        logging.info("Extracting product data via LLM API...")
        response = requests.post(
            LLM_API_CONFIG["endpoint"],
            json={
                "model": LLM_API_CONFIG["model"],
                "prompt": f"{PRODUCT_DATA_EXTRACTION_PROMPT}\n\n{markdown_content}",
                "format": "json",
                "stream": LLM_API_CONFIG["stream"],
                "options": {
                    "temperature": LLM_API_CONFIG["temperature"],
                    "num_ctx": LLM_API_CONFIG["context_window"],
                },
            },
            timeout=LLM_API_CONFIG["timeout_seconds"],
        )
        response.raise_for_status()

        raw_output = response.json()["response"].strip()
        # Clean JSON output if it's wrapped in markdown code blocks
        if raw_output.startswith(("```json", "```")):
            raw_output = raw_output.split("```")[1].strip()
            if raw_output.startswith("json"):
                raw_output = raw_output[4:].strip()

        return json.loads(raw_output)

    except requests.exceptions.RequestException as e:
        logging.error(f"LLM API request failed: {str(e)}")
        return None
    except json.JSONDecodeError as e:
        logging.error(f"Failed to parse LLM response: {str(e)}")
        return None
    except Exception as e:
        logging.error(f"Unexpected error during data extraction: {str(e)}")
        return None

def scrape_amazon_product(
    product_url: str, output_file: str = "product_data.json"
) -> None:
    """Scrape an Amazon product page and save extracted data along with HTML and Markdown to files."""
    start_time = time.time()
    logging.info(f"Starting scrape for: {product_url}")

    # Step 1: Fetch product page HTML
    product_html = fetch_product_container_html(product_url)
    if not product_html:
        logging.error("Failed to retrieve product page content")
        return

    # Optional: save HTML for debugging
    with open("amazon_product.html", "w", encoding="utf-8") as f:
        f.write(product_html)

    # Step 2: Convert HTML to Markdown
    product_markdown = html_to_md(product_html)

    # Optional: save Markdown for debugging
    with open("amazon_product.md", "w", encoding="utf-8") as f:
        f.write(product_markdown)

    # Step 3: Extract structured data via LLM
    product_data = (
        extract_product_data_via_llm(product_markdown) or DEFAULT_PRODUCT_DATA.copy()
    )

    # Step 4: Save JSON results
    try:
        with open(output_file, "w", encoding="utf-8") as json_file:
            json.dump(product_data, json_file, indent=2, ensure_ascii=False)
        logging.info(f"Successfully saved product data to {output_file}")
    except IOError as e:
        logging.error(f"Failed to save JSON results: {str(e)}")

    elapsed_time = time.time() - start_time
    logging.info(f"Completed in {elapsed_time:.2f} seconds")

if __name__ == "__main__":
    # Example usage
    test_url = (
        "<https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJAO>"
    )
    scrape_amazon_product(test_url)

Quando o script é executado com êxito, ele salva os dados extraídos do produto em um arquivo chamado product_data.json. A saída será semelhante a esta:

{
    "title": "Home Office Chair Ergonomic Desk Chair Mesh Computer Chair with Lumbar Support Armrest Executive Rolling Swivel Adjustable Mid Back Task Chair for Women Adults, Black",
    "price": 36.98,
    "original_price": 41.46,
    "discount": 11,
    "rating": 4.3,
    "review_count": 58112,
    "description": 'Office chair comes with all hardware and tools, and is easy to assemble in about 10–15 minutes. The high-density sponge cushion offers flexibility and comfort, while the mid-back design and rectangular lumbar support enhance ergonomics. All components are BIFMA certified, supporting up to 250 lbs. The chair includes armrests and an adjustable seat height (17.1"–20.3"). Its ergonomic design ensures a perfect fit for long-term use.',
    "features": [
        "100% mesh material",
        "Quick and easy assembly",
        "High-density comfort seat",
        "BIFMA certified quality",
        "Includes armrests",
        "Ergonomic patented design",
    ],
    "availability": "In Stock",
    "asin": "B00FS3VJAO",
}

Pronto! O HTML bagunçado se transforma em JSON limpo – essa é a mágica dos LLMs em raspagem da Web.

Superação das medidas antibot

Ao executar o bot de raspagem da Web acima, você provavelmente encontrará as medidas anti-bot da Amazon, como os desafios CAPTCHA:

desafio amazon-captcha-anti-bot

Isso destaca uma limitação importante: Embora nosso fluxo de trabalho baseado em LLaMA seja excelente na análise de HTML, o acesso a esse conteúdo ainda é um desafio em sites com proteções anti-bot avançadas.

Para superar isso, você precisará contornar os CAPTCHAs da Amazon e lidar com outros desafios de raspagem da Web.

É aí que entra o Scraping Browser da Bright Data, uma solução criada especificamente para lidar com as complexidades dos ambientes modernos da Web, incluindo o desbloqueio confiável até mesmo dos sites mais protegidos, onde as ferramentas tradicionais falham.

Saiba mais: Navegador de raspagem vs. navegadores sem cabeça

Por que usar o navegador Bright Data Scraping?

O Bright Data Scraping Browser é um navegador sem cabeça, baseado em nuvem, com infraestrutura de proxy integrada e recursos avançados de desbloqueio, desenvolvido especificamente para dimensionar projetos modernos de raspagem da Web. Ele faz parte da suíte de raspagem Bright Data Unlocker.

Veja por que os desenvolvedores e as equipes de dados o escolhem:

  • Impressões digitais confiáveis de TLS e técnicas de evasão furtiva
  • Rotação de IP integrada, alimentada por uma rede proxy de mais de 150 milhões de IPs
  • Resolução automática de CAPTCHA
  • Reduza a infraestrutura – Elimine as configurações de nuvem caras e a manutenção contínua
  • Suporte nativo para Playwright, Puppeteer e Selenium
  • Escalabilidade ilimitada para extração de grandes volumes de dados

A melhor parte? Você pode integrá-lo ao seu fluxo de trabalho existente com apenas algumas linhas de código.

Leia por que mais empresas estão mudando para a raspagem da Web baseada na nuvem.

Configuração do navegador de raspagem

Para começar a usar o Scraping Browser:

Crie uma conta na Bright Data (os novos usuários recebem um crédito de US$ 5 após adicionar um método de pagamento) e, no painel, vá para Proxies & Scraping e clique em Get started.

brightdata-scraping-solutions-dashboard

Crie uma nova zona (por exemplo, test_browser) e ative recursos como domínios Premium e solucionador de CAPTCHA.

brightdata-create-scraping-browser-zone

Em seguida, copie o URL do Selenium do seu painel.

brightdata-selenium-connection-credentials

Modificando seu código para o navegador de raspagem

Atualize sua função initialize_web_driver para se conectar por meio do navegador de raspagem:

from selenium.webdriver import Remote
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection

SBR_WEBDRIVER = "<https://username:password@host>:port"

def initialize_web_driver():
    options = ChromeOptions()
    sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, "goog", "chrome")
    driver = Remote(sbr_connection, options=options)
    return driver

É isso: seu raspador agora passa pela infraestrutura da Bright Data e lida com a Amazon e outros sistemas antibot com facilidade.

Explore recursos mais avançados na documentação do Navegador de raspagem.

Próximas etapas e soluções alternativas

Para ampliar os recursos de seu raspador acionado pelo LLaMA ou explorar outras implementações, considere as seguintes melhorias e alternativas.

  • Tornar o script reutilizável: Permitir que o URL e o prompt sejam passados como argumentos de linha de comando para uso flexível
  • Proteja suas credenciais: Armazene suas credenciais do navegador de raspagem em um arquivo .env e carregue-as com segurança usando python-dotenv
  • Adicionar suporte a várias páginas: Implementar lógica para rastrear várias páginas e lidar com a paginação
  • Extraia mais sites – Use os recursos antidetecção do navegador de extração para extrair outras plataformas de comércio eletrônico
  • Extraia dados dos serviços do Google – Crie raspadores dedicados para o Google Flights, a Pesquisa Google e o Google Trends, ou use a API SERP da Bright Data para obter dados de pesquisa prontos para uso

Se você preferir soluções gerenciadas ou quiser explorar outros métodos orientados pelo LLM, as seguintes opções podem ser adequadas:

  1. Raspagem com o Gemini
  2. Raspagem com perplexidade
  3. Crie um raspador de IA com o Crawl4AI e o DeepSeek

Conclusão

Este guia fornece uma base sólida para a criação de raspadores da Web resilientes usando o LLaMA 3. Ao combinar os recursos de raciocínio de modelos de linguagem grandes com ferramentas avançadas de raspagem, você pode extrair dados estruturados de sites complexos com o mínimo de esforço.

Evitar a detecção e o bloqueio é um dos maiores desafios da raspagem da Web. O Bright Data Scraping Browser aborda esse problema ao lidar automaticamente com a renderização dinâmica, a impressão digital e a proteção anti-bot. Ele faz parte de um conjunto mais amplo de ferramentas projetadas para dar suporte à extração de dados em escala:

Inscreva-se hoje mesmo para testar gratuitamente o conjunto completo de ferramentas de raspagem e proxy da Bright Data!

Não é necessário cartão de crédito