Se você já construiu um scraper em Python, provavelmente conhece o dilema: requests é rápido e barato, mas quebra em páginas com JavaScript; Selenium/Playwright resolve o JavaScript, mas consome RAM, tempo e IPs a um custo 10x maior. DrissionPage resolve esse problema unificando HTTP e controle de Chromium num único framework, permitindo alternar entre os modos sem perder cookies ou estado. E quando você combina DrissionPage com proxies residenciais, consegue acessar alvos protegidos mantendo o custo baixo.
Aviso legal: Este guia cobre coleta de dados públicos. Raspar dados atrás de login, violar Termos de Serviço ou contornar medidas técnicas de proteção pode violar leis como o CFAA nos EUA ou o GDPR na UE. Sempre verifique
robots.txt, respeite limites de taxa e prefira APIs oficiais quando disponíveis.
Neste guia de DrissionPage tutorial, você vai aprender a configurar proxies residenciais ProxyHat em ambos os modos (SessionPage e ChromiumPage), implementar rotação de IP idiomática, capturar XHR em background e escalar para produção com confiança.
DrissionPage: Um Framework, Dois Modos
DrissionPage é um framework de raspagem web em Python que unifica requisições HTTP (estilo requests) e controle de navegador Chromium (via Chrome DevTools Protocol) num único objeto. A ideia central é simples: nem toda página precisa de um browser completo, mas quando precisa, você não quer reescrever todo o pipeline.
SessionPage — HTTP puro
SessionPage usa requests por baixo. É ideal para páginas estáticas, APIs JSON e qualquer endpoint que não exija execução de JavaScript. Latência típica: 200–500ms por requisição, sem overhead de browser.
ChromiumPage — controle de browser via CDP
ChromiumPage controla o Chromium diretamente via Chrome DevTools Protocol, sem intermediários como WebDriver. Isso significa menos detecção por anti-bots e acesso a eventos de rede, console e DOM em tempo real. Latência típica: 2–5s para carregar uma página renderizada.
WebPage — o melhor dos dois mundos
WebPage é a joia do framework. Ele começa num modo e pode alternar para o outro com page.change_mode(), mantendo cookies, headers e estado de sessão compartilhados. Você pode iniciar em HTTP para uma listagem, depois escalar para Chromium apenas para a página de detalhe que requer JavaScript.
| Característica | SessionPage | ChromiumPage | WebPage |
|---|---|---|---|
| Velocidade média | 200–500ms | 2–5s | Variável |
| Consumo de RAM | ~20 MB | ~150–300 MB | Conforme modo ativo |
| Executa JavaScript | Não | Sim | Sim (no modo Chromium) |
| Compartilha cookies | Sim | Sim | Sim entre modos |
| Custo de proxy | Baixo | Alto | Otímizado |
API Idiomática do DrissionPage
DrissionPage tem uma API própria que difere de Selenium e Playwright. Entender os padrões idiomáticos é essencial para escrever código limpo e manutenível.
Localizadores: ele() e eles()
Em vez de find_element ou querySelector, DrissionPage usa ele() (singular) e eles() (plural). A sintaxe de localização é flexível:
# Por texto
page.ele('text:Login')
# Por atributo
page.ele('@class=btn-primary')
page.ele('@placeholder=Email')
# Por tag
page.ele('tag:input')
page.eles('tag:div@class=card')
# XPath
page.ele('xpath://div[@id="content"]/p')
# CSS selector
page.ele('css:div.card > h2')
ChromiumOptions — configuração do browser
ChromiumOptions é o objeto de configuração para ChromiumPage. Aqui você define caminho do binário, argumentos, proxy, user-agent e mais:
from DrissionPage import ChromiumOptions
co = ChromiumOptions()
co.set_argument('--no-sandbox')
co.set_argument('--disable-gpu')
co.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...')
co.set_proxy('http://gate.proxyhat.com:8080')
listen.start() — captura de XHR/JSON em background
Um dos recursos mais poderosos do DrissionPage Chromium é o listener de rede. Você pode interceptar respostas XHR e fetch em tempo real, extraindo dados de APIs ocultas sem precisar fazer reverse engineering manual:
page.listen.start('api/products')
page.get('https://example.com/catalog')
packet = page.listen.wait(timeout=10)
print(packet.response.body) # JSON direto da API
Isso reduz drasticamente a necessidade de renderizar páginas inteiras — você captura o JSON que o frontend já consome.
Configurando DrissionPage Proxy com ProxyHat
O DrissionPage proxy pode ser configurado de duas formas, dependendo do modo. Para SessionPage, use set_proxies(); para ChromiumPage, use ChromiumOptions.set_proxy(). Com o ProxyHat, o formato do proxy é sempre o mesmo:
- HTTP:
http://USERNAME:PASSWORD@gate.proxyhat.com:8080 - SOCKS5:
socks5://USERNAME:PASSWORD@gate.proxyhat.com:1080
Onde USERNAME contém flags de geo-targeting e sessão. Por exemplo: user-country-US-session-abc123 fixa um IP residencial nos EUA para a sessão abc123.
Por que proxies residenciais?
Alvos com proteção anti-bot (Cloudflare, Datadome, PerimeterX) detectam IPs de datacenter com facilidade. Proxies residenciais usam IPs de provedores de internet reais (Comcast, Vodafone, Vivo), tornando seu tráfego indistinguível de um usuário comum. Para alvos menos restritivos, proxies datacenter são mais rápidos e econômicos — consulte os planos ProxyHat para detalhes.
Exemplo Completo: WebPage com Rotação de Proxy
Vamos construir um exemplo completo de DrissionPage web scraping. O cenário: uma página de listagem serve HTML estático (modo HTTP), mas a página de detalhe requer JavaScript (modo Chromium). Usamos um WebPage que começa em HTTP, captura os links, depois alterna para Chromium para renderizar o detalhe — tudo através do mesmo IP residencial.
from DrissionPage import WebPage, ChromiumOptions
import time
import random
def build_proxy(country='US', session_id=None):
"""Constrói URL de proxy ProxyHat com geo e sessão."""
user = f'user-country-{country}'
if session_id:
user += f'-session-{session_id}'
password = 'SUA_SENHA_PROXYHAT'
return f'http://{user}:{password}@gate.proxyhat.com:8080'
# 1. Iniciar em modo HTTP (SessionPage) com proxy residencial
session_id = f'sess{int(time.time())}'
proxy_url = build_proxy(country='US', session_id=session_id)
page = WebPage()
page.set.proxies(proxy_url) # aplica ao modo HTTP ativo
# 2. Buscar listagem em HTTP (rápido, barato)
page.get('https://example.com/products')
links = page.eles('css:a.product-link')
product_urls = [link.attr('href') for link in links[:20]]
print(f'Encontrados {len(product_urls)} produtos')
# 3. Alternar para Chromium (mantém cookies e proxy)
co = ChromiumOptions()
co.set_proxy(proxy_url)
co.set_argument('--no-sandbox')
co.set_argument('--disable-blink-features=AutomationControlled')
page.change_mode('chromium', go=False, co=co)
# 4. Escalar para página de detalhe com JavaScript
for url in product_urls[:5]:
page.get(url)
title = page.ele('css:h1.product-title').text
price = page.ele('css:span.price').text
print(f'{title} — {price}')
time.sleep(random.uniform(2, 5)) # rate limiting
page.close()
Note que o session_id é o mesmo em ambos os modos. Isso garante que o IP residencial não mude quando você alterna de HTTP para Chromium — fundamental para evitar que o alvo detecte a mudança de fingerprint.
Capturando APIs ocultas com listen
Antes de renderizar a página inteira, vale a pena tentar capturar a API que o frontend já consome. Isso pode eliminar a necessidade do browser em muitos casos:
# No modo Chromium, antes de navegar
page.listen.start('api/product/')
page.get('https://example.com/products/123')
packet = page.listen.wait(timeout=10)
if packet:
import json
data = json.loads(packet.response.body)
print(data['price'], data['stock'])
# Se a API retorna tudo, nem precisamos do DOM
Esse padrão é o que separa scrapers amadores de pipelines de produção: em vez de parsear HTML renderizado, você intercepta o JSON que a aplicação já carrega.
Padrões de Produção com DrissionPage
Pinamento de proxy por sessão
Cada fluxo de scraping deve ter um session_id único que persiste durante todo o ciclo de vida da tarefa. Se você rotacionar o IP no meio de um fluxo (ex: login → navegação → checkout), o alvo pode invalidar a sessão. Use IDs previsíveis e rastreáveis:
import uuid
class ScraperSession:
def __init__(self, country='US'):
self.session_id = uuid.uuid4().hex[:8]
self.proxy = build_proxy(country, self.session_id)
self.page = WebPage()
self.page.set.proxies(self.proxy)
def escalate_to_chromium(self):
co = ChromiumOptions()
co.set_proxy(self.proxy)
self.page.change_mode('chromium', go=False, co=co)
def close(self):
self.page.close()
Retries com backoff exponencial
Proxies residenciais têm taxas de sucesso altas (tipicamente 95–99%), mas não perfeitas. Implemente retries com backoff:
def fetch_with_retry(page, url, max_retries=3):
for attempt in range(max_retries):
try:
resp = page.get(url, timeout=15)
if resp and page.status_code == 200:
return resp
except Exception as e:
print(f'Tentativa {attempt+1} falhou: {e}')
time.sleep(2 ** attempt + random.uniform(0, 1))
return None
Limites de concorrência
DrissionPage não é assíncono por padrão. Para concorrência, use ThreadPoolExecutor ou asyncio com cuidado. Cada ChromiumPage consome 150–300 MB de RAM, então 10 instâncias simultâneas já exigem 1,5–3 GB. Para SessionPage, você pode rodar 50–100 threads no mesmo servidor.
| Padrão | SessionPage | ChromiumPage |
|---|---|---|
| Threads recomendadas | 50–100 | 5–10 |
| RAM por instância | ~20 MB | ~150–300 MB |
| Latência por request | 200–500ms | 2–5s |
| IPs simultâneos | 1 por thread | 1 por instância |
Containerização com Docker
Para escalar ChromiumPage, containerize cada instância com Chromium headless pré-instalado. Um Dockerfile típico:
FROM python:3.11-slim
RUN apt-get update && apt-get install -y \
chromium \
chromium-driver \
&& rm -rf /var/lib/apt/lists/*
RUN pip install DrissionPage
ENV CHROME_PATH=/usr/bin/chromium
COPY scraper.py /app/
WORKDIR /app
CMD ["python", "scraper.py"]
Com orquestração (Kubernetes, Docker Swarm), você pode escalar horizontalmente adicionando réplicas. Cada pod roda 1–3 instâncias de ChromiumPage, cada uma com seu próprio proxy residencial ProxyHat.
Quando NÃO Escalar para o Browser
A tentação de usar Chromium para tudo é grande — afinal, funciona sempre. Mas o custo é real: 10x mais lento, 10x mais RAM, e 10x mais detectável. Antes de escalar, tente isto:
- Verifique se há uma API. Use
listen.start()para capturar XHR. Se a API retorna os dados, não precisa do DOM. - Tente HTTP com headers corretos. Muitas páginas "protegidas" renderizam HTML no servidor se você enviar um user-agent realista e cookies válidos.
- Analise o robots.txt. Se o endpoint está bloqueado por
robots.txt, respeite — procure uma API oficial. - Considere proxies datacenter. Se o alvo não tem anti-bot agressivo, proxies datacenter são 3–5x mais rápidos e mais baratos.
Em média, 70–80% das tarefas de scraping podem ser resolvidas em modo HTTP. Reserve Chromium para os 20–30% que realmente precisam de renderização JavaScript ou interação dinâmica.
DrissionPage Chromium vs. Alternativas
Como DrissionPage Chromium se compara a Selenium e Playwright? A diferença principal é a integração HTTP + browser num único objeto:
| Framework | HTTP puro | Browser | Modo híbrido | CDP nativo |
|---|---|---|---|---|
| DrissionPage | Sim (SessionPage) | Sim (ChromiumPage) | Sim (WebPage) | Sim |
| Selenium | Não | Sim | Não | Não (WebDriver) |
| Playwright | Sim (APIRequestContext) | Sim | Parcial | Sim |
| requests + BeautifulSoup | Sim | Não | Não | N/A |
Para quem já usa Python e quer um único toolkit, DrissionPage é a opção mais coesa. A documentação oficial está em drissionpage.cn e a documentação ProxyHat cobre detalhes de configuração de proxy.
Ética e Conformidade
Raspagem web é legal em muitos contextos, mas não é livre de restrições. Práticas recomendadas:
- Respeite
robots.txt— DrissionPage não o lê automaticamente. - Limite a taxa: 1–2 requisições por segundo por IP é um bom ponto de partida.
- Não acesse dados atrás de login sem permissão explícita.
- Não redistribua dados protegidos por copyright.
- Considere o impacto no servidor alvo — use cache e evite re-requisições.
Para casos de uso de web scraping e SERP tracking, o ProxyHat oferece infraestrutura de proxy; a responsabilidade de uso correto é sua.
Pontos-Chave (Key Takeaways)
- DrissionPage unifica HTTP e Chromium num único objeto, economizando custo e complexidade.
- Use SessionPage para 70–80% das tarefas e escale para ChromiumPage apenas quando houver JavaScript.
- WebPage alterna modos mantendo cookies e estado, ideal para fluxos híbridos.
- Proxy residencial via ProxyHat usa
gate.proxyhat.com:8080com flags de geo e sessão no username.- listen.start() captura XHR, frequentemente eliminando a necessidade de renderizar páginas.
- Pinie o proxy por sessão para evitar invalidação de sessão ao alternar modos.
- Limite concorrência: 50–100 threads para HTTP, 5–10 para Chromium.
- Respeite robots.txt, GDPR e CFAA — colete apenas dados públicos.
DrissionPage com proxies residenciais ProxyHat é uma combinação poderosa para raspagem web em Python. Comece com o modo HTTP, escale para Chromium apenas quando necessário, e mantenha o mesmo IP residencial em todo o fluxo. Confira os locais disponíveis e os planos ProxyHat para começar.






