Por que é que o Puppeteer precisa de um proxy
Os proxies para o Puppeteer permitem que a ferramenta se ligue através de um endereço IP diferente, em vez de utilizar sempre o IP do computador onde está a ser executada. Isto é útil para tarefas baseadas na localização, testes, monitorização e outras tarefas em que a origem da ligação é importante.
O Puppeteer continua a tratar da tarefa principal. O proxy trata da origem da ligação.
O que acontece sem um proxy: bloqueios de IP, limites de taxa e restrições geográficas
Sem um proxy, os sites continuam a ver o mesmo IP. À medida que a atividade aumenta, esse IP pode atingir um limite de taxa ou ser bloqueado.
A localização também pode ser importante. Uma página aberta a partir da Alemanha pode não apresentar o mesmo conteúdo que uma aberta a partir dos EUA.
Um proxy para o Puppeteer permite estabelecer ligações a partir de diferentes endereços IP e localizações, quando necessário.
Que tipo de proxy utilizar com o Puppeteer
O tipo de proxy adequado depende da tarefa.
| Tipo de proxy | Recolha de dados | Gestão de contas | Testes | Monitorização |
|---|
| Residencial | Adequado quando a localização e a origem do IP são importantes | Útil quando as contas necessitam de IPs residenciais | Adequado para testes baseados na localização | Útil para verificar conteúdos a partir de diferentes localizações |
| ISP | Adequado quando é necessário um IP estável | Útil para sessões mais longas num único IP | Adequado para testes com um IP consistente | Útil para verificações contínuas a partir do mesmo IP |
| Centro de dados | Adequado para velocidade e maiores volumes de pedidos | Melhor quando não são necessários IPs residenciais | Adequado para testes gerais | Adequado para verificações automatizadas frequentes |
Os proxies residenciais são úteis quando a origem do IP e a localização são importantes. Os proxies de ISP funcionam bem quando é necessário que o mesmo IP permaneça ativo por mais tempo. Os proxies de centro de dados fazem sentido quando o foco principal é a velocidade e a escala.
A melhor opção depende também de a tarefa exigir segmentação geográfica, uma ligação estável ou acesso a um conjunto maior de IPs.
Como ligar um proxy no Puppeteer
A configuração do proxy no Puppeteer requer o host Geonode, a porta, o nome de utilizador e a palavra-passe. Guarde as credenciais em variáveis de ambiente e, em seguida, carregue-as ao configurar o proxy no código.
Está a utilizar o Geonode? Obtenha o nome de utilizador e a palavra-passe em Credenciais de Acesso e o host, a porta e o protocolo em Informações do Servidor Proxy.
Caminho das definições ou código
No caso do Puppeteer, indique o host e a porta do proxy através de --proxy-server
ao iniciar o navegador:
import puppeteer from "puppeteer";
import "dotenv/config";
const browser = await puppeteer.launch({
headless: true,
args: [
`--proxy-server=http://${process.env.GEONODE_PROXY_HOST}:${process.env.GEONODE_PROXY_PORT}`,
],
});
Em seguida, crie a página e forneça as credenciais do proxy:
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
Mantenha o nome de utilizador e a palavra-passe reais em variáveis de ambiente, em vez de os colocar diretamente no ficheiro-fonte. Esta configuração devolveu com sucesso um código de estado HTTP 200 através do proxy no nosso teste.
O formato de autenticação host:porta:utilizador:palavra-passe
Geonode
fornece-lhe quatro valores:
proxy.geonode.io:PORT:USERNAME:PASSWORD
Para o Puppeteer, mantenha os valores separados. Armazene-os em variáveis de ambiente:
GEONODE_PROXY_HOST=proxy.geonode.io
GEONODE_PROXY_PORT=9000
GEONODE_PROXY_USER=USERNAME
GEONODE_PROXY_PASS=PASSWORD
Carregue o host e a porta através de --proxy-server
e, em seguida, autentique a página:
const browser = await puppeteer.launch({
headless: true,
args: [
`--proxy-server=http://${process.env.GEONODE_PROXY_HOST}:${process.env.GEONODE_PROXY_PORT}`,
],
});
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
Testámos isto com credenciais válidas e recebemos um código de estado HTTP 200. Com uma palavra-passe incorreta, o proxy devolveu um código de estado HTTP 407 e:
Authentication error. Please check your authentication settings.
Rotação vs. sessão fixa no Puppeteer
Se as solicitações não precisarem de manter o mesmo IP, utilize a rotação.
Para o nosso teste, iniciámos o Puppeteer com a porta HTTP em rotação:
const browser = await puppeteer.launch({
headless: true,
args: ["--proxy-server=http://proxy.geonode.io:9000"],
});
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
Efetuámos cinco solicitações utilizando sessões de navegador novas:
Request 1: 108.31.182.167
Request 2: 45.186.93.125
Request 3: 109.254.131.42
Request 4: 109.153.11.141
Request 5: 37.113.173.139
IPs únicos: 5
Rotação: Sim
Todas as cinco solicitações devolveram IPs diferentes neste teste. Isso confirma que a rotação funcionou durante a execução, mas não garante um novo IP para todas as solicitações futuras.
Se as solicitações relacionadas precisarem de permanecer no mesmo IP, utilize uma sessão fixa. Utilize a porta fixa e adicione os detalhes da sessão ao nome de utilizador:
const browser = await puppeteer.launch({
headless: true,
args: ["--proxy-server=http://proxy.geonode.io:10000"],
});
const page = await browser.newPage();
await page.authenticate({
username:
`${process.env.GEONODE_PROXY_USER}-session-blogpuppeteer01-lifetime-10`,
password: process.env.GEONODE_PROXY_PASS,
});
Fizemos três solicitações utilizando a mesma sessão:
Request 1: 178.64.64.40
Request 2: 178.64.64.40
Request 3: 178.64.64.40
Mesmo IP: Sim
Todas as três solicitações utilizaram o mesmo IP.
Consulte os guias do Geonode
sobre proxies rotativos e sessões fixas para conhecer as definições disponíveis.
Erros comuns de proxy no Puppeteer e como resolvê-los
Se o proxy não estiver a funcionar, comece por verificar os detalhes da ligação. Verifique o nome de utilizador e a palavra-passe e, em seguida, o host, a porta e o protocolo. O erro apresentado pelo Puppeteer pode, normalmente, ajudar a identificar a origem do problema.
407 Autenticação do proxy necessária
Um código de erro 407 indica normalmente um problema de autenticação.
Quando testámos o Puppeteer com uma palavra-passe incorreta, o proxy devolveu:
HTTP status: 407
Authentication error. Please check your authentication settings.
Verifique primeiro o nome de utilizador e a palavra-passe. Se estiverem corretos, certifique-se de que page.authenticate() é chamado após a criação da página.
ERR_TUNNEL_CONNECTION_FAILED / ligação recusada
Um erro de ligação significa, normalmente, que o Puppeteer não conseguiu aceder ao proxy.
Verifique primeiro o host e a porta. Em seguida, certifique-se de que o protocolo corresponde ao do servidor proxy que está a ser utilizado.
No nosso teste de falha de ligação, o Puppeteer não devolveu «ERR_TUNNEL_CONNECTION_FAILED
». Ao utilizar uma porta de proxy inacessível, foi devolvido: «
net::ERR_CONNECTION_RESET at http://ip-api.com/json
». O erro exato do Chromium pode, portanto, variar consoante a forma como a ligação falha.
Tempos de espera e respostas vazias
Um tempo de espera significa que a página não recebeu uma resposta dentro do tempo configurado.
Em primeiro lugar, verifique se o URL de destino funciona e se o proxy consegue estabelecer ligação. Se ambos estiverem a funcionar, verifique o tempo limite passado para ``page.goto()`
`.
Para o nosso teste, utilizámos um proxy não roteável com um tempo limite de cinco segundos:
await page.goto(url, {
timeout: 5000,
});
O Puppeteer devolveu:
TimeoutError: Navigation timeout of 5000 ms exceeded
Definir um tempo limite explícito pode ajudar um script a falhar rapidamente quando a ligação ao proxy fica bloqueada.
ERR_NO_SUPPORTED_PROXIES
Um problema específico do Puppeteer que detetámos foi colocar o nome de utilizador e a palavra-passe diretamente dentro de ``--proxy-server`
`.
Esta configuração falhou:
--proxy-server=http://USERNAME:PASSWORD@proxy.geonode.io:9000
O Puppeteer devolveu:
net::ERR_NO_SUPPORTED_PROXIES
A solução consiste em passar apenas o servidor proxy através do argumento de lançamento:
args: ["--proxy-server=http://proxy.geonode.io:9000"]
Em seguida, efetue a autenticação separadamente:
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
Após alterar a configuração, o pedido foi bem-sucedido com o código HTTP 200.
Puppeteer + Geonode: o que obtém
O Puppeteer gere os pedidos ou as ligações na aplicação. O Geonode gere a ligação através do proxy.
Pode escolher proxies residenciais, de ISP ou de centro de dados consoante a tarefa e, em seguida, utilizar rotação, sessões fixas e segmentação geográfica sempre que necessário. Isto mantém a configuração do proxy separada do resto do código da aplicação.
Os planos variam consoante o tipo de proxy, com algumas opções com preços por GB.
O Puppeteer suporta proxies do tipo «SOCKS5»?
O SOCKS5 autenticado não funcionou com a configuração do Puppeteer que testámos.
Tentámos a porta rotativa SOCKS5 do Geonode com page.authenticate(), mas o Puppeteer devolveu:
net::ERR_SOCKS_CONNECTION_FAILED
Também tentámos incorporar as credenciais em --proxy-server, o que devolveu:
net::ERR_NO_SUPPORTED_PROXIES
Como nenhuma das configurações testadas do SOCKS5 autenticado funcionou, a configuração HTTP verificada com --proxy-server e page.authenticate() é a opção mais segura para esta configuração.
Posso alternar os endereços IP por pedido no Puppeteer?
Sim, o Puppeteer pode utilizar um proxy rotativo quando o navegador é iniciado através da configuração do proxy rotativo.
No nosso teste, cinco sessões novas do navegador devolveram cinco endereços IP diferentes. Isso confirma que a rotação ocorreu durante o teste, mas não é garantido que haja um endereço IP diferente para cada pedido ou sessão do navegador.
Existe um período de teste gratuito?
Sim. O Geonode oferece um período de teste gratuito, pelo que o proxy pode ser testado com o Puppeteer antes de se passar para um plano pago. Consulte o período de teste gratuito atual e os planos.
Onde devo configurar o proxy no Puppeteer?
Defina o host e a porta do proxy em puppeteer.launch()
utilizando --proxy-server
.
Em seguida, chame page.authenticate()
após criar cada página para fornecer o nome de utilizador e a palavra-passe:
const browser = await puppeteer.launch({
args: ["--proxy-server=http://proxy.geonode.io:9000"],
});
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
Esta foi a configuração que funcionou nos nossos testes.
Devo introduzir o nome de utilizador e a palavra-passe do proxy em --proxy-server?
Não. Mantenha as credenciais separadas ao utilizar esta configuração do Puppeteer.
Ao incorporar USERNAME:PASSWORD@ diretamente em --proxy-server, obtivemos ERR_NO_SUPPORTED_PROXIES no nosso teste. Ao passar apenas o host e a porta nesse local e, em seguida, utilizar page.authenticate() para as credenciais, o processo funcionou com sucesso.