Saltar para o conteúdo
Comece grátis
Voltar ao blogue

Tutorial de Python do Nodriver: Extração discreta de dados da Web — Do primeiro script à produção

Suciu DanÚltima atualização em 15 min read
Tutorial de Python do Nodriver: Extração discreta de dados da Web — Do primeiro script à produção
Resumo: O Nodriver é uma biblioteca Python assíncrona que controla o Chromium através do Chrome DevTools Protocol, sem Selenium nem o binário chromedriver. Utilize-o quando um navegador furtivo auto-hospedado, mais próximo de uma sessão real do Chrome, é melhor do que uma stack WebDriver, mas saiba que, por si só, não elimina riscos de IP, TLS ou comportamento. Este tutorial vai de um primeiro script à produção em contentores e a uma Browser API alojada.

O Nodriver é uma biblioteca Python assíncrona que controla o Chromium através do Protocolo Chrome DevTools — sem Selenium, sem o binário chromedriver. Recorra a ela quando um navegador «stealth» auto-hospedado, que se assemelha mais a uma sessão real do Chrome, for mais vantajoso do que uma configuração clássica do WebDriver. Este guia começa com um scraper funcional numa sandbox pública, passa por um ambiente de produção em contentor e termina com a situação em que o mesmo fluxo se enquadra melhor numa API de navegador hospedada.

Pontos-chave

  • O Nodriver comunica diretamente com o CDP; por si só, não elimina riscos relacionados com IP, TLS ou comportamentais.
  • Fixa a versão. Na versão 0.50.3 + Chrome 154 (2026-10-06), select retorna None em caso de falha, wait_for lança uma exceção e xpath falha com DOM.enable falta.
  • Prefira uc.loop() em vez de asyncio.run para um encerramento correto; browser.stop() é sincronizado.
  • Para trabalhos que exigem discrição, prefira o Chrome com interface gráfica sob o Xvfb: a versão sem interface gráfica ainda pode divulgar HeadlessChrome no UA.
  • É na produção que os scrapers falham: contentores, concorrência limitada, novas tentativas, verificações do IP de saída, validação da saída.
  • Mapeie esperas/ações para parâmetros da API do navegador (wait_for_css, wait_until, js_instructions, …) quando ultrapassar a capacidade de auto-hospedagem.

O que é o nodriver (e o que não é)

CDP direto vs WebDriver

Percurso clássico do Selenium:

Your script  →  WebDriver protocol  →  chromedriver  →  Chrome

Percurso do Nodriver:

Your script  →  Chrome DevTools Protocol (websockets)  →  Chrome

Ignorar o binário do driver elimina os marcadores de automação específicos do WebDriver e toda uma classe de falhas relacionadas com discrepâncias de versão. Não torna o seu IP residencial, a sua pilha TLS única, nem o tempo dos seus cliques semelhante ao de um ser humano.

Linhagem do undetected-chromedriver

O Nodriver é o sucessor assíncrono e orientado para o CDP, proveniente da mesma linhagem de autores que o undetected-chromedriver. O modelo passa de «aplicar um patch ao driver» para «nunca utilizar o driver». Apenas para navegadores da família Chromium; API exclusivamente assíncrona.

Quais as camadas de deteção que aborda

Camada

O que os defensores observam

O que o nodriver altera (modelo)

Ambiente JS

navigator.webdriver, peculiaridades do objeto Chrome

Melhora a pegada de automação JS por predefinição em comparação com o WebDriver puro (verificar ainda por destino)

Protocolo / controlador

Impressões digitais do chromedriver

Evita o WebDriver utilizando o CDP

TLS / HTTP2

Impressões digitais JA3 / ALPN / HTTP2

Não substitui a pilha de rede do navegador

IP / ASN / localização geográfica

Intervalos de centros de dados, reputação

Não corrige; requer proxies / encaminhamento residencial

Comportamento

Tempo de resposta, percursos do rato, padrões de deslocamento

Não inventa comportamento humano por si

Sinais «headless»

HeadlessChrome UA, plugins em falta, etc.

Depende do modo; consulte a nossa secção sobre modo sem interface gráfica

A sua equipa deve desenvolver com o nodriver? (quadro de decisão)

Verificado por volta da preparação para publicação em 06/10/2026:

  • Licença: AGPL-3.0 no pacote PyPI que instalámos. Isto é relevante para serviços ligados à rede que modificam e executam o código. Isto não constitui aconselhamento jurídico — peça a um advogado que leia a AGPL se fornecer um SaaS baseado num fork.
  • Formato da API: apenas assíncrona; navegadores da família Chromium.
  • Manutenção: a última versão do PyPI verificada para este guia é a 0.50.3 (13/05/2026). Verifique novamente as estrelas/issues/commits no dia da publicação antes de se comprometer com uma plataforma a longo prazo.
  • Cobertura de testes / classificador alfa: o PyPI ainda indica «Estado de Desenvolvimento :: 3 - Alfa». Esteja preparado para possíveis falhas quando o Chrome mudar.
  • Fork: existem o Zendriver e outros forks do CDP, caso necessite de uma abordagem de manutenção diferente — consulte a matriz de ferramentas mais adiante.

Precisa de suporte a vários navegadores (Firefox/WebKit), APIs de sincronização ou uma licença permissiva para um produto comercial sem análise da AGPL? O Nodriver pode não ser a base adequada.

Instalar e verificar (fixado)

python3 -m venv venv
source venv/bin/activate
pip install 'nodriver==0.50.3'

Lista de verificação de instalação:

  1. Python ≥ 3.9.
  2. Uma instalação local do Chrome/Chromium (confirme com google-chrome --version).
  3. dependências de tempo de execução obtidas automaticamente: websockets>=14 , mss, deprecated.
  4. Não nomeie o seu script nodriver.py (isso sobreporia o nome do pacote).
  5. Teste: abre uma página pública e aguarda um seletor (script abaixo).

O teu primeiro scraper

Ambiente de teste para este artigo: quotes.toscrape.com — um alvo de demonstração diferente da loja virtual utilizada em vários tutoriais concorrentes.

# 01_first_scraper.py — verified 2026-10-06 on nodriver 0.50.3
import nodriver as uc

async def main():
    browser = None
    try:
        browser = await uc.start(headless=True)
        tab = await browser.get("https://quotes.toscrape.com/")
        await tab.select("div.quote", timeout=15)  # wait for state, not time
        quotes = await tab.select_all("div.quote")
        for q in quotes:
            text_el = await q.query_selector("span.text")
            author_el = await q.query_selector("small.author")
            print((text_el.text or "").strip(), "—", (author_el.text or "").strip())
    finally:
        if browser is not None:
            browser.stop()  # sync on 0.50.3 — do not await

if __name__ == "__main__":
    # Package README recommends uc.loop(); see event-loop notes below
    uc.loop().run_until_complete(main())

Selecionar e extrair de forma fiável

Tabela de decisão do método de seleção (0.50.3)

Necessidade

Método

Em caso de falha (0.50.3, 06/10/2026)

Utilizar quando

Wait + CSS

await tab.select(css, timeout=…)

Retorna None (não gera exceção; a descrição da função está incorreta)

Espera de prontidão por predefinição

CSS de execução única

await tab.query_selector(css)

Retorna None

Já sabe que o DOM está pronto

Espera que deve falhar de forma evidente

await tab.wait_for(selector=…)

Lança TimeoutError

Barreira rígida antes de continuar

Pesquisa de texto

await tab.find(text, best_match=True)

Falha leve após novas tentativas

Botões/rótulos sem CSS estável

Muitos nós

await tab.select_all(css)

Comportamento semelhante a uma lista vazia após novas tentativas

Listas/cartões

XPath

await tab.xpath(…)

Deixou de funcionar na versão 0.50.3 + Chrome 154 — ProtocolException: 'DOM.enable' wasn't found

Prefira seletores CSS

Funções auxiliares para texto e atributos

def attr_get(el, name: str):
    if el is None:
        return None
    attrs = el.attrs  # ContraDict in nodriver 0.50.3
    if attrs is None:
        return None
    try:
        return attrs.get(name)
    except Exception:
        try:
            return attrs[name]
        except Exception:
            return None

# Observed: element.text and element.text_all both return usable strings

Estado do XPath na versão 0.50.3 + Chrome 154

Falha no Chrome 154 + nodriver 0.50.3 (2026-10-06) ao chamar DOM.enable. Não distribua scrapers dependentes de XPath nesta combinação sem uma nova verificação.

Páginas dinâmicas

À espera de um estado, não de tempo

Aguarde por um seletor, texto ou condição de rede inativa. Corrigido sleep destina-se a casos raros de depuração visual — não a scrapers finais. Prefira select / wait_for em vez de tab.sleep em percursos de produção.

Paginação que mantém a integridade durante a navegação

Depois de clicar em «Seguinte», os identificadores dos elementos antigos podem desligar-se. Volte a consultar o controlo em cada tentativa; aguarde uma alteração do URL ou um novo seletor de conteúdo.

# Pagination retry pattern for quotes.toscrape.com-style next links
async def click_next_with_retry(tab, max_attempts=3) -> bool:
    for _ in range(max_attempts):
        next_link = await tab.select("li.next > a", timeout=5)
        if next_link is None:
            return False
        before = tab.url
        try:
            await next_link.click()
        except Exception:
            continue
        for _ in range(20):
            await tab.sleep(0.25)
            await tab.select("div.quote", timeout=2)
            if tab.url != before:
                return True
        if tab.url != before:
            return True
    return False

Páginas 1→2→3 avançadas; os autores alteraram-se conforme esperado.

Deslocamento infinito com condições de paragem

Para páginas sem um controlo de link «Seguinte», percorra até uma condição de paragem: um marcador de fim, um limite de contagem ou o número máximo de iterações.

async def scroll_until_plateau(tab, max_rounds=20):
    history = []
    plateau = 0
    for round_i in range(1, max_rounds + 1):
        items = await tab.select_all("div.item")
        count = len(items)
        end = await tab.query_selector("#end-marker")
        history.append(count)
        if end is not None:
            return {"reason": "end_marker", "count": count}
        if len(history) >= 2 and history[-1] == history[-2]:
            plateau += 1
        else:
            plateau = 0
        if plateau >= 2:
            return {"reason": "count_plateau", "count": count}
        await tab.evaluate("window.scrollTo(0, document.body.scrollHeight)")
        await tab.sleep(0.4)
    return {"reason": "max_rounds", "count": history[-1] if history else 0}

Parou end_marker nos 40 itens após 4 rondas.

Cliques, separadores, iframes e avaliação (curta)

  • Nova aba/janela: browser.get(url, new_tab=True) / new_window=True (API do pacote).
  • tab.evaluate(expr) para sondagens de deslocamento/DOM — prefira seletores sempre que possível.
  • Cookies: trate os jars como segredos; oculte-os nos registos (nota de segurança, não é um tutorial aprofundado sobre cookies).
  • Capturas de ecrã: await tab.save_screenshot(...) funcionaram na nossa execução de diagnóstico.

Identidade: agente do utilizador, modo headless e Xvfb

Uma identidade consistente vs. rotação

Faz corresponder o agente do utilizador à versão do Chrome que realmente inicias. Uma rotação aleatória que não corresponda ao Chrome/154 (ou o que quer que esteja a executar) é um indício fácil de identificar. Dê preferência a uma identidade de ambiente de trabalho estável por cada perfil de trabalhador.

Sinais «headless» no Chrome 154 (2026-10-06)

Apenas em páginas de diagnóstico públicas (bot.sannysoft.com; areyouheadless devolveu 502 em ambos os modos):

Modo

navigator.userAgent

navigator.webdriver

headless=True

contém HeadlessChrome/154.0.0.0

False

headless=False sob o Xvfb

contém Chrome/154.0.0.0 (sem Headless)

False

O 154.0.0.0 formulação dessas cadeias de caracteres é a forma reduzida do user-agent do Chrome, não um erro ortográfico em relação à 154.0.8037.57 . O Nodriver consegue limpar navigator.webdriver em ambos os modos, enquanto o modo «headless» continua a identificar-se através da cadeia de caracteres do agente de utilizador. Isso, por si só, é suficiente para muitas verificações simples.

Utilizado com o Xvfb como predefinição para trabalhos que exigem discrição

Em servidores Linux sem ecrã físico:

# pattern
xvfb-run -a python your_scraper.py
# or export DISPLAY to a running Xvfb and start(headless=False)

Utilize o modo «headless» para sandboxes internas e CI. Utilize o modo «headed» + Xvfb quando o alvo identificar as cadeias de caracteres do agente de utilizador do modo «headless».

Proxies sem revelar o seu IP

Proxies não autenticados vs. autenticados

Não assuma que as configurações do Chrome correspondem às apresentadas noutros blogs. Antes de automatizar barreiras de login atrás de um proxy, verifique na sua versão do Chrome se o IP de saída do navegador é o IP do proxy — e não o IP do seu host.

Verifique sempre o IP de saída

# Guard pattern — wire to your proxy stack; always assert exit IP before scraping
async def assert_exit_ip(tab, expected_subnet_prefix: str | None = None):
    tab2 = await tab.browser.get("https://httpbin.org/ip")  # or your IP echo
    await tab2.select("body", timeout=15)
    body = (await tab2.get_content()) if hasattr(tab2, "get_content") else None
    # parse JSON IP; compare to expected proxy IP; fail closed
    return body

Cancele a tarefa se o IP de saída observado for o do seu host do centro de dados. Efetue esta verificação em produção, mesmo quando o proxy «parecer estar configurado».

Proxies residenciais e encaminhamento geográfico

Quando o problema for a reputação do IP ou a afinidade com o país — e não a automação do DOM —, encaminhe o tráfego através de proxies residenciais ou transfira o trabalho do navegador para um pedido da API do navegador com country definido.

Executar o nodriver em produção

A maioria dos tutoriais pára antes desta fase. É aqui que os scrapers falham.

Receita de contentor (esboço)

# Outline only — adapt paths and package names for your base image
FROM python:3.13-slim-bookworm
RUN apt-get update && apt-get install -y --no-install-recommends \
    wget gnupg ca-certificates fonts-liberation xvfb \
    && install Google Chrome / Chromium per your distro docs \
    && useradd -m scraper
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
USER scraper
ENV DISPLAY=:99
CMD ["sh", "-c", "Xvfb :99 -screen 0 1920x1080x24 & python worker.py"]

Notas: execute como utilizador não-root; compreenda os sinalizadores da sandbox do Chrome em contentores restritos; mantenha os perfis num volume gravável se reutilizar cookies conquistados com esforço; e oculte esses cookies nos registos.

Modelo de concorrência

Unidade

Isolamento

Utilização típica

Separadores num único navegador

Processo/cookies/impressão digital partilhados

Passos relacionados numa sessão

Vários navegadores

Melhor isolamento, mais RAM

Tarefas paralelas

Vários processos/contentores

Isolamento máximo

Frotas de trabalhadores

Concorrência limitada com um asyncio.Semaphore (ou trabalhadores em fila). Meça a memória por navegador em páginas semelhantes às de produção no seu hardware.

Novas tentativas, tempos de espera e recuperação após falhas

  • Limite de tempo por navegação com wait_for / select limites.
  • Classifique os erros: tempo limite, janela vazia, página de desafio, falha do Chrome.
  • Reinicie o processo do navegador após erros de protocolo repetidos — não apenas o separador.
  • Limitar as tentativas com backoff com jitter.

Observabilidade

  • Métricas: sucesso / bloqueio / tempo de espera / vazio por anfitrião.
  • Captura de ecrã em caso de falha para armazenamento de objetos.
  • Ocultação de registos: nome de utilizador/palavra-passe do proxy, Cookie cabeçalhos, dumps de armazenamento.

Validação da saída

O «sucesso» de tipo HTTP no navegador não constitui HTML utilizável. Deteta títulos de desafio, estruturas de aplicações vazias e seletores obrigatórios em falta antes de gravar no armazém. Combina isto com a mentalidade de validação da tua stack de scraping mais ampla (evita ser bloqueado).

Verificação da realidade anti-bot

Âmbito (06/10/2026): apenas páginas públicas de impressão digital/diagnóstico. Sem alvos comerciais da Cloudflare ou da DataDome (de acordo com a política editorial deste artigo).

Alvo

Resultado

bot.sannysoft.com

Carregado; útil para comparação de UA / webdriver sniff

arh.antoinevastel.com/bots/areyouheadless

502 Bad Gateway — inconclusivo

Páginas comerciais do Cloudflare / DataDome / Turnstile

Não abordado neste guia

Tab.verify_cf auxiliar

Presente na versão 0.50.3; considere opcional e verifique nos seus alvos

Considere qualquer afirmação do tipo «o nodriver contorna X» que não seja acompanhada de um teste datado e com âmbito definido como mera propaganda. Para alvos reforçados, consulte também as orientações do produto sobre como contornar o Cloudflare.

Escolha a sua ferramenta (matriz por restrição)

Versões verificadas através do índice PyPI em 06/10/2026. A postura de discrição é qualitativa, não uma pontuação.

Ferramenta

Linguagem

Navegadores

Síncrona/assíncrona

Licença (sinal PyPI)

Postura de discrição

Carga operacional

nodriver 0.50.3

Python

Família Chromium

assíncrono

AGPL-3.0

CDP, sem WebDriver

Executa o Chrome + ecrã

zendriver 0.17.1

Python

Família Chromium

assíncrono

AGPL

Fork da linhagem do nodriver

Semelhante

Playwright 1.63.0

muitos

Chromium, Firefox, WebKit

ambos

Apache-2.0 (projeto)

Automação robusta, mais fácil de detetar tal como está

Gestão de controladores mais leve

Patchright 1.63.0

Python

Canal Chromium/Chrome

ambos

consulte a LICENÇA

Playwright com correções

Semelhante ao Playwright

Camoufox 0.5.7

Python

Firefox (personalizado)

ambos

MIT (PyPI)

Ângulo da impressão digital do Firefox

Operações binárias do navegador

SeleniumBase 4.55.1 (Modo CDP)

Python

Chromium

ambos

MIT

Opção de modo CDP

Peso da estrutura

API do navegador hospedado

qualquer (HTTP)

gerido

n/a

comercial

Operado pelo fornecedor

Operações locais mínimas

Escolha com base nos seguintes critérios: licença, motor do navegador, necessidades de sincronização e quem é responsável pelo tempo de atividade.

Desenvolver ou adquirir: nodriver auto-hospedado ou um navegador hospedado

O que determina o custo

  • Problemas com ecrãs / Xvfb / GPU em máquinas virtuais na nuvem
  • RAM e CPU por sessão simultânea do Chrome
  • Proxies residenciais ou móveis
  • Tempo de engenharia para atualizações do Chrome e seletores avariados
  • Gestão de bloqueios e plantão
  • Armazenamento de capturas de ecrã e ocultação de dados pessoais identificáveis
  • Análise de conformidade com a AGPL

Opte pela auto-hospedagem quando precisar de sessões interativas prolongadas, extensões personalizadas ou integração estreita com redes internas. Adquira o serviço quando quiser livrar-se das responsabilidades relacionadas com SLAs de pedido/resposta, restrições geográficas e manutenção do navegador.

Nodriver → Tabela de conversão da API do navegador

A API do navegador é uma chamada REST para https://api.webscrapingapi.com/v1—não um socket CDP ativo (confirmação do produto). Nomes dos parâmetros verificados nos parâmetros da API em 06/10/2026:

Padrão Nodriver

Parâmetro da API do navegador

Aguardar CSS (select / wait_for)

wait_for_css

Preparação do ciclo de vida

wait_until (domcontentloaded, load, networkidle0, networkidle2)

Atraso adicional

wait_for (ms)

Sequências de cliques / deslocamento / digitação

js_instructions

Captura de ecrã

screenshot=1 (+ screenshot_options)

Extração de campos

extract_rules

Contexto geográfico

country

Dispositivo / janela de visualização

device, window_width, window_height

Documentação: Pedido GET, renderização em JavaScript.

Quando a API do Scraper ( render_js=1 ) for suficiente

render_js=1) for suficiente

Se precisar apenas de um instantâneo HTML renderizado sem um script de interação em várias etapas, comece com a API Scraper e a renderização em JS. Passe para a API do Navegador quando precisar de ações ordenadas, esperas de seletor, capturas de ecrã ou regras de extração numa única solicitação. Compare as opções em APIs de Acesso à Web.

Resolução de problemas (sintoma → causa → solução)

A partir de erros que reproduzimos em 06/10/2026:

Sintoma

Causa provável

Solução

select retorna None após o tempo limite

Seletor incorreto ou conteúdo nunca foi renderizado

Corrija o seletor; utilize a instrução wait_for se precisar de uma falha definitiva

TimeoutError de wait_for

Esperado — falha após o orçamento

Aumente o tempo de espera ou faça um screenshot

ProtocolException: 'DOM.enable' wasn't found

xpath no nosso Chrome 154 + 0.50.3

Utilize CSS; volte a testar o XPath após as atualizações

UA contém HeadlessChrome

headless=True

Executar sob o Xvfb para alvos sensíveis

Tarefas pendentes / Event loop is closed após o script

asyncio.run desligamento vs. ouvintes nodriver

Preferir uc.loop(); garantir browser.stop() em finally

Lista de citações vazia após «sucesso»

Navegação prematura / página errada

Aguardar novamente no seletor de conteúdo; validar a contagem

Paginação bloqueada

Identificador do link seguinte desatualizado

Re-select o controlo «seguinte» a cada tentativa

O proxy «funciona», mas o site deteta o IP local

Configuração incorreta de autenticação/proxy

Proteção do IP de saída antes da recolha de dados

Utilização responsável

Extraia apenas páginas públicas elegíveis, respeite os robôs/Termos de Serviço e a legislação aplicável, minimize os dados pessoais e proteja as credenciais. Leia «Dados da Web responsáveis». Para um contexto «headless» mais abrangente, consulte «Navegador headless em Python».

Perguntas frequentes

O que é o nodriver?

Uma biblioteca Python assíncrona que controla o Chromium através do CDP sem o Selenium ou o chromedriver. Este guia utiliza a versão 0.50.3 (verificada em 06/10/2026).

Em que é que o nodriver difere do undetected-chromedriver e do Selenium?

O Selenium utiliza o WebDriver + um binário de driver. O undetected-chromedriver aplica patches a esse caminho. O nodriver ignora o WebDriver e comunica com o CDP de forma assíncrona.

O nodriver é detetável?

Ele bloqueia alguns sinais de automação, mas não elimina fugas de IP, TLS, comportamento ou UA headless. Na nossa execução, navigator.webdriver foi False, mas o modo «headless» continuava exposto HeadlessChrome no UA.

O nodriver funciona no modo «headless»?

Sim, para scraping funcional na nossa sandbox. Para alvos sensíveis à discrição, é preferível utilizar o modo «headed» + Xvfb, com base na diferença de UA que medimos.

Como posso utilizar um proxy autenticado com o nodriver sem revelar o meu IP?

Configure o proxy para a sua versão do Chrome e, em seguida, verifique sempre o IP de saída antes de iniciar a tarefa.

O nodriver consegue contornar o Cloudflare ou o DataDome?

Não generalize a partir de páginas de diagnóstico para produtos de bots comerciais. Se utilizar verify_cf a versão 0.50.3, verifica-o nos teus próprios alvos antes de confiar nele.

Nodriver vs Playwright vs Zendriver: qual devo utilizar?

Escolha com base na licença, no motor do navegador, nas necessidades de sincronização/assincronização e em quem é responsável pelas operações — consulte a matriz acima. O Playwright destaca-se no suporte a vários motores; o nodriver e o zendriver são otimizados para uma postura de discrição no CDP com a AGPL; a API do navegador hospedada é a melhor opção quando não pretende utilizar frotas do Chrome.

Como é que executo o nodriver no Docker ou num servidor Linux?

Instale o Chrome, execute em modo «headed» sob o Xvfb (ou aceite as desvantagens do modo «headless»), com um utilizador não root e workers limitados. Utilize o esboço do Dockerfile como ponto de partida e valide a imagem no seu ambiente.

Quantos navegadores nodriver posso executar em paralelo?

Avalie com base no seu hardware e nas páginas de destino. Não confie em alegações de simultaneidade sem os seus próprios dados.

É seguro utilizar o nodriver para fins comerciais (licença)?

O pacote que instalámos está sob a licença AGPL-3.0. Consulte um advogado antes de o integrar num serviço de rede. Isto não constitui aconselhamento jurídico.

Quando devo utilizar uma API de navegador hospedada em vez do nodriver?

Quando pretender utilizar esperas/ações/localização geográfica REST sem ter de operar o Chrome, ou quando os custos de proxy e manutenção forem predominantes. Converta as suas esperas do nodriver em wait_for_css / js_instructions e compare uma solicitação.

Próximo passo

Escolha uma página que o seu script do nodriver já processe e envie-a através de uma única solicitação da API do navegador com wait_for_css (e js_instructions se fizer scroll ou clicar). Compare o tempo de desenvolvimento, os modos de falha e o formato do resultado. Para grandes volumes, localização geográfica ou entrega gerida, contacte a equipa da WebScrapingAPI.


Sobre o autor

Suciu Dan, Co-fundador @ WebScrapingAPI

Suciu Dan

Co-fundador

Suciu Dan é cofundador da WebScrapingAPI e escreve guias práticos, voltados para programadores, sobre web scraping em Python, web scraping em Ruby e infraestruturas de proxy.

Como lidar com URLs de redirecionamento do Google /goto e tokens CAES num scraper de SERP
A ciência da extração de dados da Web

Como lidar com URLs de redirecionamento do Google /goto e tokens CAES num scraper de SERP

TL;DR: Resumo: Os URLs /goto do Google com um token CAES, e os wrappers /url mais antigos, são camadas de redirecionamento, não destinos, por isso um scraper de SERP que trata cada href como final estraga o acompanhamento de posições e as bases de links. Prefira uma API de SERP estruturada quando devolve os links de destino. Quando tiver de analisar HTML, classifique cada href, elimine redirecionamentos duplicados e resolva-os com um GET simples. Não desencripte o CAES.

Suciu Dan13 min read
Ler artigo
Cabeçalhos de resposta HTTP no cURL: Cada flag, técnica e receita de scripting
A ciência da extração de dados da Web

Cabeçalhos de resposta HTTP no cURL: Cada flag, técnica e receita de scripting

TL;DR: O cURL esconde os cabeçalhos de resposta por padrão. Use -i para ver os cabeçalhos junto com o corpo, -I para uma solicitação HEAD que retorna apenas cabeçalhos, -v para depuração completa de solicitação/resposta e -D para salvar cabeçalhos em um arquivo. Para scripts modernos, o cURL 7.83+ permite extrair cabeçalhos individuais ou despejar todos eles como JSON com a opção -w write-out.

Suciu Dan12 min read
Ler artigo
O que é um navegador sem cabeça? Arquitetura, casos de utilização e principais ferramentas
A ciência da extração de dados da Web

O que é um navegador sem cabeça? Arquitetura, casos de utilização e principais ferramentas

TL;DR: Um navegador sem cabeça é um navegador web que funciona sem uma interface gráfica visível, controlado inteiramente através de código ou instruções de linha de comando. Os desenvolvedores usam navegadores headless para testes automatizados, raspagem da Web, monitoramento de desempenho e, cada vez mais, para alimentar agentes de IA. Este guia aborda como eles funcionam internamente, quando escolher um em vez de um navegador normal e quais estruturas valem o seu tempo.

Suciu Dan15 min read
Ler artigo

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.