Python Web Scraping em 2026: httpx + BeautifulSoup + Playwright - Quando usar qual
A maioria dos tutoriais de "Python web scraping" de 2018 ainda recomenda requests + BeautifulSoup. A parte requests é boa, mas agora existem padrões melhores, e metade da web moderna renderiza conteúdo em JavaScript, então a pilha clássica retorna silenciosamente páginas vazias.
Este guia cobre a árvore de decisão de 2026: quando httpx + BeautifulSoup está certo (ainda mais de 90% dos sites), quando recorrer ao Playwright, como evitar ser bloqueado e as duas regras que mantêm seu scraper legal e ético.
A árvore de decisão em uma imagem
É isso. Noventa por cento das tarefas de scraping são HTML estático – a pilha clássica (renomeada) é a ferramenta certa. O resto precisa de execução JS e o Playwright é a resposta moderna.
Etapa 1: httpx + BeautifulSoup (o caso de 90%)
httpx é o substituto imediato para requests. Mesma API, mais suporte HTTP/2 e assíncrono nativo. BeautifulSoup permanece inalterado desde 2015 — a escolha do analisador é importante (lxml é 5x mais rápido que o padrão).
Principais escolhas:
- `headers={"User-Agent": ...}` — sempre defina um UA real (um endereço de contato é educado). O UA
httpxpadrão costuma ser bloqueado. - `timeout=10` — nunca faça uma solicitação ilimitada; conexões interrompidas vazam descritores de arquivo.
- `raise_for_status()` — aumenta em 4xx/5xx para que as falhas sejam altas, não silenciosas.
- Analisador `"lxml"` — 5x mais rápido que o
html.parserpadrão e mais indulgente com HTML malformado. - `soup.select("css-selector")` — trate scraping como "finja que você está usando
document.querySelectorAllde JavaScript". Os seletores CSS geralmente são o que você deseja, não a API de caminhada em árvore.
Etapa 2: Dramaturgo (quando JS renderiza o conteúdo)
Muitos SPAs modernos (React, Vue, Angular) enviam um <div id="root"> vazio e hidratam tudo do lado do cliente. httpx.get fornece um shell vazio - os dados que você deseja são carregados via fetch após o carregamento da página.
Teste: httpx.get(url).text — pesquise os dados desejados. Se não estiver lá, o site precisa de execução JS.
Instale: pip install playwright && playwright install chromium (o download do navegador é de aproximadamente 150 MB - vale a pena uma vez, doloroso em cada CI executado sem cache).
Custo: o Playwright é 10-50x mais lento que httpx (carregamento da página + execução JS + sobrecarga do navegador). Alcance-o apenas quando os dados não estiverem no HTML estático.
As quatro maneiras de ser bloqueado
A maioria dos sistemas anti-raspagem observa estas quatro impressões digitais:
1. Agente de usuário ausente/óbvio
2. Sem atraso entre solicitações
Solicitações sequenciais brutas martelam um servidor. Adicione um atraso proporcional ao tempo de resposta – se uma página levar 500 ms para ser veiculada, espere 500-2.000 ms entre as solicitações. asyncio.sleep(random.uniform(0.5, 2.0)).
3. Solicitando caminhos não permitidos /robots.txt
Alguns sites usam robots.txt para sinais de taxas legítimas - verifique antes de copiar:
4. Incompatibilidade de impressão digital de TLS/navegador
Anti-raspagem avançada (Cloudflare, DataDome) imprime impressões digitais em seu handshake TLS e ambiente JS. httpx não se parece em nada com o Chrome na camada TLS. Opções:
curl_cffi— uma biblioteca baseada em curl-impersonate que imita o TLS real do navegador.- Playwright — navegador real TLS por definição.
- Rotação de proxies residenciais – a opção nuclear.
Para 99% dos casos de uso (sites não hostis, volume moderado, sem necessidade de login), o respeito httpx + UA real + atraso + robots.txt é suficiente. Se você estiver explorando sites protegidos pela Cloudflare em grande escala, precisará de navegadores reais ou de serviços de desbloqueio pagos.
Taxa limitando-se (o semáforo + padrão de sono)
Para raspagem em massa, combine asyncio.Semaphore (máximo simultâneo) com asyncio.sleep (atraso por solicitação):
Limitar o atraso de 5 a 10 simultâneos + 500 ms a 2 s por solicitação mantém você bem abaixo do que aciona alarmes de limite de taxa na maioria dos sites.
Regras legais + éticas
1. Leia os Termos de Serviço do site. Muitos proíbem completamente a raspagem – você ainda pode fazê-lo (os ToS são leis contratuais, não leis criminais na maioria das jurisdições), mas você assume riscos legais. LinkedIn v. hiQ (2022) estabeleceu que a coleta de dados publicamente visíveis não é uma violação da CFAA nos EUA, mas usar um moletom com capuz não o torna invisível.
2. Não raspe dados pessoais. GDPR / CCPA / todo o resto penaliza a coleta de informações pessoais sem consentimento. Se você estiver construindo um conjunto de dados de “funcionários da Empresa X”, pare.
Adições éticas que todos esquecem:
- Envie um endereço de contato real na sua UA. Se o seu bot causar problemas, o proprietário do site poderá enviar um e-mail para você.
- Se você armazenar em cache os dados do site, faça um cache agressivo – não acesse seus servidores a cada execução.
- Prefira APIs públicas mesmo que sejam pagas. Mais barato que o risco legal.
O resumo de ferramentas de 2026
| Tarefa | Alcance |
|---|---|
| Páginas HTML estáticas | httpx + BeautifulSoup(html, "lxml") |
| SPA renderizado em JS | Playwright (cromo sem cabeça) |
| Cloudflare / anti-bot | curl_cffi ou Playwright + proxy residencial |
| Raspagem de alto volume | httpx.AsyncClient + Semáforo + suspensão |
| Dados estruturados de API | httpx.get + .json() — não precisa de sopa |
A raspagem da Web em 2026 ainda é 90% httpx + BeautifulSoup, além de saber quando escalar para um navegador real. Domine os hábitos de raspagem educada (UA real, semáforo, suspensão, robots.txt) e você construirá pipelines de dados duráveis sem ser bloqueado ou processado.
Próxima etapa: o curso Data Science tem 15 lições sobre scraping, ETL e pandas. Você criará um pipeline real de ponta a ponta, desde busca HTTP até DataFrame e exportação CSV.