Web Scraping e LLMs

Guia de Python Web Scraping e Extração para LLMs (2026)

Resposta Rápida: Em 2026, python web scraping projects para alimentar LLMs exigem um pipeline em duas etapas: renderização headless assíncrona (Playwright ou Crawl4AI) combinada com poda algorítmica de ruído do DOM (removendo SVG, scripts e menus). Para dados estruturados, esquemas Pydantic via Instructor garantem JSON confiável, reduzindo os custos de inferência em 75-88%.


1. Introdução: Web Scraping na Era dos LLMs e Agentes de IA

Agentes autônomos de IA e arquiteturas RAG dependem criticamente de dados web atualizados. Embora modelos como Claude 3.7 Sonnet, DeepSeek V3/R1 e GPT-4o suportem janelas de até 2 milhões de tokens, injetar HTML bruto diretamente na atenção do Transformer é uma prática antieconômica e ineficiente.

Tradicionalmente, ao realizar scrape website python, utilizava-se requests com BeautifulSoup ou Scrapy. Contudo, a web atual é composta por SPAs dinâmicas em React, Next.js e Vue, protegidas por WAFs como Cloudflare Turnstile, DataDome e Akamai.

O objetivo da extração evoluiu:

  • Scraping Legado (2015–2023): Salvar campos estáticos em bancos de dados relacionais via seletores XPath/CSS.
  • Scraping para LLMs (2026): Podar ruídos de código, manter Markdown semântico e extrair JSON fortemente tipado com esquemas Pydantic.

2. Comparativo de Ferramentas: BeautifulSoup vs Scrapy vs Playwright vs Crawl4AI

Dimensão BeautifulSoup4 + Requests Scrapy (Twisted/AsyncIO) Raw Playwright (Async Python) Crawl4AI (v0.9.x+)
Uso Principal Scripts simples e HTML estático Extração distribuída de grande porte SPAs dinâmicas e interações JS Agentes de IA, RAG e extração LLM
Execução JS Nenhuma Nenhuma (requer Scrapy-Playwright) Motores completos Chromium e WebKit Chromium otimizado para LLMs
Throughput ~15-25 req/s por worker ~150-300 req/s por spider ~5-12 pág/s por 16GB RAM ~25-45 pág/s (reutilização)
Consumo de Memória Mínimo (~40MB) Baixo (~120MB) Alto (150-350MB por contexto) Moderado (~80-140MB por aba)
Conversão Markdown Exige biblioteca externa Pipeline customizado Integração manual Markdown nativo otimizado para LLM
Poda de Ruído DOM Filtro manual em código Seletores manuais Scripts CDP manuais PruningContentFilter e BM25 nativos
Evasão Anti-Bot Básica (apenas User-Agent) Proxies em middleware Avançada (playwright-stealth) Stealth nativo e emulação TLS
Suporte Pydantic Nenhum ItemLoaders Nenhum Motor nativo de esquemas Pydantic

3. Economia de Tokens: Poda de Ruído DOM

O código HTML bruto contém de 85% a 95% de dados irrelevantes (classes de estilo, imagens Base64, scripts de analytics).

Análise de custos para 50.000 páginas diárias (GPT-4o a $2.50 / 1M tokens)

  • Tokens diários em HTML bruto: 50.000 × 55.000 = 2,75 bilhões de tokens
  • Tokens diários em Markdown limpo: 50.000 × 4.200 = 210 milhões de tokens
  • Economia diária: (2.750 - 210) × $2.50 = $6.350,00 / dia
  • Economia mensal: $190.500,00 / mês

4. Implementação Prática: Async Playwright e Selectolax

# clean_scraper.py
import asyncio
from playwright.async_api import async_playwright
from selectolax.parser import HTMLParser
import markdownify

async def scrape_clean_markdown(url: str) -> str:
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True, args=["--no-sandbox"])
        page = await browser.new_page()
        await page.goto(url, wait_until="networkidle", timeout=30000)
        raw_html = await page.content()
        await browser.close()

    parser = HTMLParser(raw_html)
    for tag in ["script", "style", "svg", "noscript", "header", "footer", "nav", "aside"]:
        for node in parser.css(tag):
            node.decompose()

    main = parser.css_first("main, article, #content") or parser.css_first("body")
    return markdownify.markdownify(main.html if main else parser.html, heading_style="ATX")

5. Extração com Crawl4AI

# crawl4ai_pipeline.py
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai.content_filter_strategy import PruningContentFilter

async def run_crawl4ai(url: str) -> str:
    async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler:
        config = CrawlerRunConfig(
            cache_mode=CacheMode.BYPASS,
            content_filter=PruningContentFilter(threshold=0.48),
            wait_until="networkidle"
        )
        res = await crawler.arun(url=url, config=config)
        return res.markdown

6. Extração Estruturada com Pydantic e Instructor

# pydantic_extractor.py
import os
from typing import List, Optional
from pydantic import BaseModel, Field
import instructor
from openai import OpenAI

class TechSpec(BaseModel):
    name: str = Field(description="Nome do recurso")
    supported: bool = Field(description="Suporte nativo")

class ProductInfo(BaseModel):
    product_name: str
    price_usd: Optional[float] = None
    specs: List[TechSpec]

def extract_data(clean_md: str) -> ProductInfo:
    client = instructor.from_openai(OpenAI(api_key=os.environ["OPENAI_API_KEY"]))
    return client.chat.completions.create(
        model="gpt-4o-mini",
        response_model=ProductInfo,
        messages=[{"role": "user", "content": clean_md}],
        temperature=0.0
    )

7. Evasão de WAF com curl_cffi

# stealth_requester.py
from curl_cffi import requests

def fetch_stealth(url: str, proxy: str = None) -> str:
    proxies = {"http": proxy, "https": proxy} if proxy else None
    return requests.get(url, impersonate="chrome124", proxies=proxies, timeout=15).text

8. Comparativo de Custo Total (100.000 Páginas)

Componente Playwright Bruto Playwright + Selectolax Crawl4AI Async Firecrawl Cloud
Infraestrutura (AWS) $48.00 $22.00 $16.00 $0.00
Proxies Residenciais $120.00 $32.00 $30.00 Incluído
Inferência LLM (GPT-4o) $13.750.00 $1.050.00 $975.00 $825.00
Custo Total $13.918.00 $1.104.00 $1.021.00 $1.024.00

9. Recomendações de Engenharia

  1. Abordagem Híbrida: Priorize curl_cffi para HTML estático e acione Crawl4AI em SPAs.
  2. Poda Obrigatória: Nunca envie HTML bruto; mantenha a taxa de compressão acima de 80%.
  3. Tipagem com Pydantic: Use Instructor para garantir conformidade estrita de dados.
  4. Desacoplamento: Utilize filas assíncronas (Celery/ARQ) entre scraping e LLMs.
← Todos os artigos
0 / 4