Guia do agente de usuário Puppeteer: configuração e alteração

Domine as técnicas para definir e alternar agentes de usuário no Puppeteer para aprimorar seus esforços de Scraping de dados e contornar as defesas anti-bot.
12 min de leitura
Puppeteer
User Agent Guide blog image

Neste guia do agente de usuário Puppeteer, você verá:

  • Scraping de dados
  • Como é o agente do usuário padrão no Puppeteer
  • Como substituir o agente de usuário padrão do Chrome headless
  • Como implementar a rotação do agente do usuário no Puppeteer
  • Como usar o Puppeteer Extra para tornar o agente do usuário anônimo

Vamos começar!

Por que você precisa definir um agente de usuário personalizado

O cabeçalho User-Agent é uma string que o cliente define para se identificar a um servidor ao entrar em contato com ele por meio de uma solicitação HTTP. Normalmente, ele inclui informações sobre a máquina e/ou aplicativo de onde a solicitação se origina. Esse cabeçalho é definido por navegadores da web, clientes HTTP ou qualquer software que execute solicitações da web.

Abaixo está um exemplo da string do agente do usuário definida pelo Chrome ao solicitar páginas da web:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/127.0.0.0 Safari/537.36

A string do agente do usuário acima consiste nos seguintes componentes:

  • Mozilla/5.0: originalmente usado para indicar compatibilidade com navegadores Mozilla, esse prefixo agora é incluído para compatibilidade mais ampla.
  • Windows NT 10.0; Win64; x64: Indica o sistema operacional (Windows NT 10.0), a plataforma (Win64) e a arquitetura do sistema (x64).
  • AppleWebKit/537.36: Refere-se ao mecanismo do navegador que o Chrome usa.
  • (KHTML, como Gecko): indica compatibilidade com os mecanismos de layout KHTML e Gecko.
  • Chrome/127.0.0.0: Especifica o nome e a versão do navegador.
  • Safari/537.36: Indica compatibilidade com o Safari.

Essencialmente, a string do agente do usuário pode revelar se a solicitação vem de um navegador conhecido ou de outro tipo de software.

O erro que a maioria dos bots de Scraping de dados e scripts de automação cometem é usar agentes de usuário padrão ou que não são de navegador. Esses valores são fáceis de serem detectados por medidas anti-bot projetadas para proteger páginas da web. Ao analisar o cabeçalho User-Agent, os servidores podem determinar se a solicitação pode ser de um bot automatizado.

Para obter mais detalhes, consulte nosso guia sobre agentes de usuário para Scraping de dados.

Qual é o agente de usuário padrão do Puppeteer?

O Puppeteer automatiza tarefas do navegador controlando uma versão especial de um navegador da web real. Por padrão, ele executa uma versão específica do Chrome, embora também seja compatível com o Firefox. Assim, você pode supor que o agente de usuário padrão no Puppeteer corresponderia ao definido pela versão controlada do Chrome. Bem, esse não é o caso…

A razão é que o Puppeteer inicia o navegador no modo headless por padrão. Quando os navegadores operam no modo headless, eles geralmente definem um agente de usuário distinto. Na versão atual, o agente de usuário padrão do Puppeteer é assim:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) HeadlessChrome/127.0.0.0 Safari/537.3

Observe a string HeadlessChrome, que identifica o Chrome como estando em execução no modo headless. Não é surpresa que a string acima seja exatamente o agente do usuário da versão mais recente do Chrome headless.

Para confirmar que a string acima é realmente o agente de usuário padrão do Puppeteer, configure um script e navegue até a página httpbin.io/user-agent. Esse endpoint da API retorna o cabeçalho User-Agent da solicitação, ajudando você a descobrir o agente de usuário usado por qualquer navegador ou cliente HTTP.

Crie um script Puppeteer, visite a página desejada, recupere a resposta da API do corpo e imprima-a:

import puppeteer from "puppeteer";

(async () => {

// inicie o navegador e abra uma nova página

const browser = await puppeteer.launch();

const page = await browser.newPage();

// conecte-se à página de destino

await page.goto("https://httpbin.io/user-agent");

// extraia o texto do corpo com a resposta da API

// e imprima-o

const bodyText = await page.evaluate(() => {

return document.body.innerText;

});

console.log(bodyText);

// feche o navegador e libere seus recursos

await browser.close();

})();

Para saber mais sobre a API Puppeteer, leia nosso guia sobre Scraping de dados com Puppeteer.

Execute o código Node.js acima e você receberá a seguinte string:

{

"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/127.0.0.0 Safari/537.36"

}

Observe que o agente do usuário definido pelo Puppeteer corresponde à string apresentada anteriormente.

O problema está no identificador HeadlessChrome, que pode alertar os sistemas anti-bot. Esses sistemas analisam as solicitações recebidas em busca de padrões que possam indicar atividade de bot, como strings de agente do usuário incomuns. As solicitações suspeitas são sinalizadas e bloqueadas de acordo. É por isso que modificar a string padrão do agente do usuário Puppeteer é tão importante!

Como alterar o agente do usuário do Puppeteer

Alterar o agente do usuário é uma operação tão comum e útil que o Puppeteer fornece um método específico para isso. Em particular, a classe Page expõe o método setUserAgent(). Isso permite que você modifique o agente do usuário definido pelo Puppeteer ao navegar para páginas da web nessa guia do navegador.

Use setUserAgent() para alterar o agente do usuário do Puppeteer conforme abaixo:

await page.setUserAgent("<seu_agente_de_usuário>");

Todas as solicitações HTTP GET feitas chamando o método goto() na página agora terão um cabeçalho User-Agent personalizado. Lembre-se de que essa alteração se aplica apenas ao objeto de página específico. Se você abrir uma nova página e interagir com ela, o Puppeteer usará o agente do usuário padrão visto anteriormente.

Para um exemplo completo, dê uma olhada no seguinte trecho:

import puppeteer from "puppeteer";

(async () => {

// inicie o navegador e abra uma nova página

const browser = await puppeteer.launch();

const page = await browser.newPage();

// defina um agente de usuário personalizado

await page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36");

// conectar-se à página de destino

await page.goto("https://httpbin.io/user-agent");

// extrair o texto do corpo com a resposta da API

// e imprimi-lo

const bodyText = await page.evaluate(() => {

return document.body.innerText;

});

console.log(bodyText);

// fechar o navegador e liberar seus recursos

await browser.close();

})();

Execute o script acima e, desta vez, o resultado será:

{

"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"

}

Ótimo! A string do agente do usuário extraída da página corresponde ao agente do usuário configurado no código. Agora você sabe como realizar a operação de alteração do agente do usuário no Puppeteer.

Implementar a rotação do agente do usuário no Puppeteer

Substituir o cabeçalho User-Agent de um navegador headless por um de um navegador não headless pode não ser suficiente para escapar dos sistemas anti-bot. O problema é que seu script de automação do navegador exibirá padrões que indicam comportamento não humano. Isso é particularmente verdadeiro se você enviar um grande número de solicitações com os mesmos cabeçalhos a partir do mesmo endereço IP.

Para minimizar o risco de detecção de bots no Puppeteer, você precisa tornar suas solicitações o mais variadas possível. Um método eficaz é definir um agente de usuário diferente para cada solicitação. Essa estratégia é chamada de rotação do agente de usuário e ajuda a reduzir a probabilidade de ser sinalizado como um bot.

Na seção seguinte do tutorial, você aprenderá como implementar a rotação de agente do usuário no Puppeteer!

Etapa 1: gerar um agente de usuário aleatório

Existem duas abordagens principais para obter um agente de usuário aleatório. A primeira é obter uma lista de agentes de usuário válidos e selecionar aleatoriamente um da lista, conforme mostrado em nosso guia de agente de usuário Node.js.

A segunda abordagem é usar uma biblioteca geradora de agentes de usuário de terceiros. A mais popular em JavaScript é user-agents, um pacote que pode gerar agentes de usuário válidos para você. Neste guia, seguiremos esse método!

Execute este comando npm para adicionar a biblioteca user-agents às dependências do seu projeto:

npm install user-agents

Observe que o user-agents é atualizado diariamente, garantindo que sempre inclua os agentes de usuário mais recentes.

Após instalar a biblioteca, importe o objeto UserAgent para o seu script Puppeteer:

import UserAgent from "user-agents";

Agora você pode gerar uma string de agente de usuário aleatória com o seguinte código:

const userAgent = new UserAgent().random().toString();

Confira a documentação oficial para obter informações sobre usos mais avançados, como obter agentes de usuário para dispositivos específicos, sistemas operacionais e muito mais.

Etapa 2: definir o agente de usuário aleatório

Passe a string do agente de usuário aleatório para o Puppeteer chamando o método setUserAgent():

const userAgent = new UserAgent().random().toString();

await page.setUserAgent(userAgent);

Todas as solicitações realizadas por meio do objeto de página agora terão um agente de usuário personalizado, gerado aleatoriamente.

Etapa 3: Visite a página de destino

Chame o método goto() na página para visitar sua página da web de destino no navegador headless controlado:

await page.goto("https://httpbin.io/user-agent");

Etapa 4: Junte tudo

Abaixo está o seu script final de rotação do agente do usuário Puppeteer:

import puppeteer from "puppeteer";

import UserAgent from "user-agents";

(async () => {

// inicie o navegador e abra uma nova página

const browser = await puppeteer.launch();

const page = await browser.newPage();

// gere um agente de usuário aleatório

const userAgent = new UserAgent().random().toString();

// defina um agente de usuário aleatório

await page.setUserAgent(userAgent);

// conecte-se à página de destino

await page.goto("https://httpbin.io/user-agent");

// extrair o texto do corpo com a resposta da API

// e imprimi-lo

const bodyText = await page.evaluate(() => {

return document.body.innerText;

});

console.log(bodyText);

// fechar o navegador e liberar seus recursos

await browser.close();

})();

Execute o script algumas vezes e você deverá ver diferentes agentes de usuário.

Et voilà! A lógica de rotação do agente do usuário no Puppeteer funciona perfeitamente.

Defina um agente de usuário personalizado no Puppeteer com o puppeteer-extra-plugin-anonymize-ua

As abordagens acima para a configuração do agente do usuário do Puppeteer são eficazes, mas têm uma desvantagem significativa. O método userAgent() altera apenas o agente do usuário para uma sessão de página específica, não em todas as guias do navegador.

Para garantir que o Puppeteer nunca use o agente de usuário padrão, você pode usar o plugin puppeteer-extra-plugin-anonymize-ua do Puppeteer Extra. Se você não está familiarizado com este projeto, o Puppeteer Extra estende o Puppeteer adicionando suporte para plugins definidos pela comunidade. Você pode descobrir mais em nosso guia sobre o plugin Puppeteer Extra Stealth.

O plugin puppeteer-extra-plugin-anonymize-ua pode tornar anônimo o agente do usuário definido pelo Puppeteer. Para instalar o puppeteer-extra e o plugin necessário, execute o seguinte comando:

npm install puppeteer-extra puppeteer-extra-plugin-anonymize-ua

Em seguida, importe o puppeteer do puppeteer-extra e o AnonymizeUAPlugin do puppeteer-extra-plugin-anonymize-ua:

import puppeteer from "puppeteer-extra";

import AnonymizeUAPlugin from "puppeteer-extra-plugin-anonymize-ua";

Configure o puppeteer-extra-plugin-anonymize-ua para gerar um agente de usuário aleatório e registre-o como um plugin com o método use() do Puppeteer Extra:

puppeteer.use(

AnonymizeUAPlugin({

customFn: () => new UserAgent().random().toString(),

})

);

Agora, tente visitar páginas em duas guias diferentes usando dois objetos de página separados:

import puppeteer from "puppeteer-extra";

import AnonymizeUAPlugin from "puppeteer-extra-plugin-anonymize-ua";

import UserAgent from "user-agents";

(async () => {

// configure e registre o

// plugin puppeteer-extra-plugin-anonymize-ua

puppeteer.use(

AnonymizeUAPlugin({

customFn: () => new UserAgent().random().toString(),

})

);

// inicie o navegador e abra uma nova página

const browser = await puppeteer.launch();

// abra uma nova página

const page1 = await browser.newPage();

// conectar-se à página de destino

await page1.goto("https://httpbin.io/user-agent");

// extrair o texto do corpo com a resposta da API

// e imprimi-lo

const bodyText1 = await page1.evaluate(() => {

return document.body.innerText;

});

console.log(bodyText1);

// abrir uma nova página

const página2 = aguardar browser.newPage();

// conectar-se à página de destino

aguardar página2.goto("https://httpbin.io/user-agent");

// extrair o texto do corpo com a resposta da API

// e imprimi-lo

const bodyText2 = await page2.evaluate(() => {

return document.body.innerText;

});

console.log(bodyText2);

// fechar o navegador e liberar seus recursos

await browser.close();

})();

O resultado serão dois agentes de usuário diferentes, conforme mostrado abaixo:

{

"user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 como Mac OS X) AppleWebKit/605.1.15 (KHTML, como Gecko) Versão/17.5 Mobile/15E148 Safari/604.1"

}

{

"user-agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36"

}

Os dois agentes de usuário são diferentes e nenhum deles é o agente de usuário padrão do Puppeteer. Isso ocorre porque o puppeteer-extra-plugin-anonymize-ua personaliza cada objeto de página com um agente de usuário aleatório, conforme especificado na função customFn. Dessa forma, o Puppeteer nunca expõe seu agente de usuário padrão!

Conclusão

Neste artigo, você explorou a importância de definir o cabeçalho User-Agent e viu como é o agente de usuário padrão do Puppeteer. Você aprendeu como substituir esse valor e implementar a rotação do agente de usuário para escapar dos sistemas básicos anti-scraping. No entanto, sistemas mais sofisticados ainda podem detectar e bloquear suas solicitações automatizadas. Para evitar banimentos de IP, você pode configurar um Proxy no Puppeteer, mas mesmo isso pode não ser sempre suficiente!

Para uma solução mais eficaz, experimente o Navegador de scraping— um navegador de última geração que se integra ao Puppeteer e a qualquer outra ferramenta de automação de navegador. O Navegador de scraping pode contornar facilmente as tecnologias anti-bot para você, evitando a identificação do navegador. Nos bastidores, ele conta com recursos como rotação do agente do usuário, rotação de IP e Resoluçãode CAPTCHA. A automação do navegador nunca foi tão fácil!

Inscreva-se agora e comece seu teste gratuito.