Evite ser bloqueado com Puppeteer Stealth

Saiba como integrar Puppeteer Stealth num script de raspagem de Puppeteer para evitar ser bloqueado.
8 min read
Avoid Getting Blocked With Puppeteer Stealth

Este tutorial de Puppeteer Stealth irá cobrir:

  • O que é a deteção de bots e porque é que é um problema para Puppeteer.
  • O que é Puppeteer Extra.
  • Como utilizar o Plugin Stealth com Puppeteer Extra para evitar bloqueios.

Deteção de bots: O maior inimigo de Puppeteer

Puppeteer é uma das bibliotecas de JavaScript mais utilizadas para a automatização do navegador. É tão popular porque é apoiada pela equipa de Chrome em Google. A sua API de alto nível permite-lhe controlar navegadores sem cabeça ou com cabeça através do protocolo DevTools, o que a torna uma excelente ferramenta para a raspagem da web, testes automatizados e desenvolvimento de bots.

No entanto, Puppeteer pode ser facilmente impedido por tecnologias de deteção de bots. Isto é particularmente verdade quando se utiliza Chrome/Chromium em modo sem cabeça. Porquê? Porque Puppeteer define automaticamente propriedades e cabeçalhos predefinidos que fazem com que o navegador sob controlo apareça como uma instância sem cabeça. Por exemplo, define a seguinte configuração de Chrome: navigator.webdriver: true.

As soluções antibot sabem disso e analisam essas definições para determinar se o usuário atual é um humano ou um bot. Quando encontram algumas configurações suspeitas, marcam o usuário como um bot.

Por exemplo, considere este teste de deteção de bots em modo sem cabeça. Se abrir a página de teste no seu navegador, verá:

 Se abrir a página de teste no seu navegador, verá que não é Chrome sem cabeça

Agora, tente visitar esse sítio com Puppeteer vanilla e extraia o resultado do teste:

import puppeteer from "puppeteer"

(async () => {
    // set up the browser and launch it
    const browser = await puppeteer.launch()

    // open a new blank page
    const page = await browser.newPage()

    // navigate the page to the target page
    await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")

    // extract the message of the test result
    const resultElement = await page.$("#res")
    const message = await resultElement.evaluate(e => e.textContent)

    // print the resulting message
    console.log(`The result of the test is "%s"`, message);

    // close the current browser session
    await browser.close()
})()

Inicie o script acima e verá:

The result of the test is "You are Chrome headless"

Isto significa que o teste falhou, uma vez que a página foi capaz de detetar o pedido automático como vindo de um navegador sem cabeça.

Por defeito, Puppeteer é uma ferramenta limitada. Para evitar a deteção de bots, teria de o ajustar manualmente e substituir as configurações predefinidas. Evite tudo isso com Puppeteer Extra!

Puppeteer Extra: Uma versão extensível de Puppeteer

Puppeteer Extra é um wrapper leve construído em torno de Puppeteer que o estende com suporte a plugins. Por outras palavras, puppeteer-extra é um substituto de puppeteer. Para além de funcionar como a popular biblioteca de automação do navegador, fornece o método use() para registar plugins.

Cada plugin acrescenta uma funcionalidade extra a Puppeteer. Alguns dos plugins mais úteis disponíveis são:

  • puppeteer-extra-plugin-stealth: Para tornar mais difícil para a tecnologia de deteção de bots detetar instâncias de navegador sem cabeça.
  • puppeteer-extra-plugin-recaptcha: Para resolver reCAPTCHAs e hCaptchas automaticamente.
  • puppeteer-extra-plugin-adblocker: Para remover anúncios e rastreadores, reduzindo a largura de banda e os tempos de carregamento como resultado.
  • puppeteer-extra-plugin-devtools: Para tornar a depuração do navegador possível a partir de qualquer lugar, criando um túnel seguro para as ferramentas de desenvolvimento.
  • puppeteer-extra-plugin-repl: Para tornar a depuração divertida com uma interface REPL (Read-Eval-Print-Loop) interativa.
  • puppeteer-extra-plugin-block-resources: Para bloquear dinamicamente os recursos da página, como imagens, ficheiros multimédia, CSS e JS.
  • puppeteer-extra-plugin-anonymize-ua: Para tornar anónimo o cabeçalho de agente de usuário na navegação da página. Saiba porque é que isto é importante no nosso guia sobre agente de usuário para raspagem da web.
  • puppeteer-extra-plugin-user-preferences: Para definir as preferências personalizadas do usuário de Chrome/Chromium.

Vamos agora aprofundar o plugin Puppeteer Stealth.

O que é e o que faz o plugin Stealth de Puppeteer Extra

puppeteer-extra-plugin-stealth é um plugin para Puppeteer Extra que inclui um conjunto de configurações para evitar a deteção de bots. Em pormenor, Puppeteer Stealth baseia-se em módulos de evasão incorporados que substituem as fugas e propriedades de Puppeteer que o expõem como um bot. Por exemplo, remove “HeadlessChrome” do cabeçalho de agente de usuário e exclui a propriedade navigator.webdriver definida pelo Puppeteer por padrão.

O objetivo do plugin Stealth de Puppeteer Extra é fazer com que uma instância de Chromium sem cabeça controlada pelo Puppeteer passe todos os testes de deteção de bots em sannysoft.com. Atualmente, atinge o seu objetivo. Ao mesmo tempo, como indicado na documentação oficial, ainda há maneiras de detetar o Chromium sem cabeça. Isto significa que é impossível contornar todos os mecanismos de deteção de bots, mas a ideia do projeto é tornar esse processo o mais difícil possível.

Como utilizar Puppeteer Stealth para evitar a deteção de bots durante a raspagem de páginas web

Está na altura de ver como integrar Puppeteer Stealth num script de raspagem de Puppeteer para evitar ser bloqueado.

Siga os passos abaixo!

Passo 1: Instalar Puppeteer Extra e o plug-in Stealth

Execute o comando abaixo para adicionar Puppeteer Extra e o plugin Puppeteer Stealth às dependências do seu projeto:

npm install puppeteer-extra puppeteer-extra-plugin-stealth

Ótimo! Acabou de cumprir os pré-requisitos para integrar o plug-in Stealth no seu script automatizado de Puppeteer.

Passo 2: Configurar Puppeteer Extra e registar o plug-in Stealth

Primeiro, substitua a instrução de importação de puppeteer por esta instrução:

import puppeteer from "puppeteer-extra"

Por outras palavras, certifique-se de que importa o objeto puppeteer de "puppeteer-extra``" e não de "puppeteer``".

Depois, importe StealthPlugin de puppeteer-extra-plugin-stealth:

import StealthPlugin from "puppeteer-extra-plugin-stealth"

Se, em vez disso, for um usuário de CommonJS, precisará:

const puppeteer = require("puppeteer-extra")
const StealthPlugin = require("puppeteer-extra-plugin-stealth")

Em seguida, registe o plugin Stealth, passando-o para o objeto de Puppeteer através do método use():

puppeteer.use(StealthPlugin())

Espetacular! Acabou de adicionar ao Puppeteer as capacidades de evasão predefinidas suportadas pelo plug-in.

Note-se que o construtor StealthPlugin() aceita um objeto opcional com o conjunto de cadeias de caracteres correspondentes às evasões a ativar:

// enable only a few evasion techniques
puppeteer.use(StealthPlugin({
    enabledEvasions: new Set(["chrome.app", "chrome.csi", "defaultArgs", "navigator.plugins"])
}))

Caso contrário, utilize a lógica abaixo para remover dinamicamente uma estratégia de evasão específica do plug-in Stealth:

const stealthPlugin = StealthPlugin()
puppeteer.use(stealthPlugin)

// ...

// remove the "user-agent-override" evasion method
pluginStealth.enabledEvasions.delete("user-agent-override")

Passo 3: Juntar tudo

Integre Puppeteer Extra e o seu plugin Stealth no script que viu no início do artigo:

import puppeteer from "puppeteer-extra"
import StealthPlugin from "puppeteer-extra-plugin-stealth"

(async () => {
    // configure the stealth plugin
    puppeteer.use(StealthPlugin())
    // set up the browser and launch it
    const browser = await puppeteer.launch()

    // open a new blank page
    const page = await browser.newPage()

    // navigate the page to the target page
    await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")

    // extract the message of the test result
    const resultElement = await page.$("#res")
    const message = await resultElement.evaluate(e => e.textContent)

    // print the resulting message
    console.log(`The result of the test is "%s"`, message);

    // close the current browser session
    await browser.close()
})()

Execute este trecho e imprimirá:

The result of the test is "You are not Chrome headless"

Et voilà! A página selecionada com capacidades de deteção de bots já não é capaz de marcar o seu script automatizado de Puppeteer como um bot.

Parabéns! Agora é um ninja de Puppeteer Stealth, e nenhuma tecnologia de deteção de bots vai assustá-lo.

Conclusão

Neste artigo, você entendeu por que a deteção de bots é um desafio para Puppeteer e como lidar com isso. Graças a Puppeteer Extra, pode alargar a funcionalidade de Puppeteer com plugins. Em particular, o plugin Stealth é um grande aliado para evitar a deteção de bots, e aqui aprendeu a utilizá-lo.

Não importa o quão sofisticado seja o seu Puppeteer Extra, as tecnologias antibot avançadas, como Cloudflare, ainda serão capazes de detetar e bloquear os seus scripts. Pode optar por outro pacote de automatização do navegador, mas a causa da deteção é o navegador e não a biblioteca. A solução é um navegador escalável com funcionalidade de desvio antibot que possa ser integrado em qualquer biblioteca de automatização de navegadores. Esse navegador existe e chama-se Navegador de Raspagem!

O Navegador de Raspagem da Bright Data é um navegador de nuvem altamente escalável que funciona com Puppeteer, Playwright, Selenium e muito mais. Rota automaticamente o IP de saída em cada pedido e pode tratar da impressão digital do navegador, da resolução de CAPTCHA e de tentativas automáticas por você. Isto é possível graças às funcionalidades de desbloqueio baseadas em proxy em que assenta.

Os proxies de Bright Data são usados por empresas da Fortune 500 e mais de 20.000 clientes. Esta rede mundial fiável de proxy envolve:

Fale com um dos nossos representantes de vendas e veja qual dos produtos da Bright Data melhor se adapta às suas necessidades.