Skip to content

Passando despercebido

Quando um scraper é bloqueado, geralmente o código está correto; o problema são os sinais. Os sites leem três camadas: o que o seu navegador diz que é (User-Agent, marcadores de headless, fingerprint), como ele se comporta (cliques instantâneos, digitação perfeitamente regular) e como ele responde aos desafios (Cloudflare Turnstile). Esta página estabelece o mínimo para cada camada e aponta para os guias mais aprofundados.

Algumas das partes difíceis você já ganha de graça: como o Pydoll controla um Chrome real via CDP, os fingerprints de rede e de navegador são autênticos, e navigator.webdriver é false sem nenhum patch. O que segue é o que ainda cabe a você controlar.

Você vai aprender

Mantenha a identidade consistente

A identidade é a camada mais difícil, porque os sinais têm que concordar entre si e com o seu IP e sistema operacional. O User-Agent, os Client Hints, o idioma, o fuso horário, o renderer WebGL e as fontes são todos verificados de forma cruzada; sobrescrever um deles isoladamente costuma te deixar mais detectável, não menos. O Pydoll já mantém parte disso consistente para você (ele ajusta o User-Agent e os Client Hints juntos quando você define --user-agent=) e aplica uma identidade completa e coerente através de apply_fingerprint().

Comece por Técnicas de evasão para as alavancas que você controla (User-Agent, idioma, WebRTC, perfil realista) e por Injeção de fingerprint para aplicar uma identidade completa a partir de um único perfil.

Interaja como uma pessoa

Cliques instantâneos no centro exato de um elemento e teclas digitadas a cada 50ms são fingerprints comportamentais. Passe humanize=True e o Pydoll move o cursor por um caminho curvo, com um tempo humano, antes de clicar, e digita com ritmo variável e erros de digitação ocasionais que são corrigidos:

search_box = tab.find(id='search')
search_box.type_text('browser automation', humanize=True)

submit = tab.find(tag_name='button', type='submit')
submit.click(humanize=True)
search_box = await tab.find(id='search')
await search_box.type_text('browser automation', humanize=True)

submit = await tab.find(tag_name='button', type='submit')
await submit.click(humanize=True)

A humanização é opcional por interação, então você a mantém onde o comportamento é observado e a dispensa onde a velocidade importa. Interações humanizadas explica o modelo de tempo e como ajustá-lo.

Lide com o Cloudflare Turnstile

Quando uma página protegida exibe o checkbox do Turnstile, o Pydoll consegue detectá-lo e clicar nele para você:

with tab.expect_cloudflare_turnstile():
    tab.go_to('https://site-protected-by-cloudflare.com')

print('Challenge handled, page loaded.')
async with tab.expect_cloudflare_turnstile():
    await tab.go_to('https://site-protected-by-cloudflare.com')

print('Challenge handled, page loaded.')

Clicar no widget é apenas parte disso: se o Cloudflare aceita ou não o clique também depende da reputação do seu IP e de quão consistente o resto do seu navegador parece. Se os desafios continuarem falhando, siga por Bypass de captcha e considere um proxy residencial.

Seu script Playwright está bloqueado

O próprio Playwright adiciona uma quarta camada de sinais: o driver habilita o domínio Runtime, abre o navegador com --enable-automation e injeta scripts a cada navegação. Forks de stealth removem isso depois do fato, no driver (Patchright) ou no navegador (Camoufox), e precisam continuar patcheando conforme os dois mudam.

O Pydoll não tem driver para patchear. Troque um import e o mesmo script roda pela conexão CDP do próprio Pydoll, que nunca habilita Runtime para o seu código e nunca adiciona essas flags:

from pydoll.playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    with page.tab.expect_cloudflare_turnstile():
        page.goto('https://site-protected-by-cloudflare.com')
from pydoll.playwright.async_api import async_playwright

async with async_playwright() as p:
    browser = await p.chromium.launch(headless=False)
    page = await browser.new_page()
    async with page.tab.expect_cloudflare_turnstile():
        await page.goto('https://site-protected-by-cloudflare.com')

As três camadas acima continuam valendo para esse script: identidade, comportamento e desafios são seus para configurar, por page.tab. Traga seu script Playwright percorre isso.

O que vem a seguir