Desbloqueador de nós para raspagem da Web

Suciu Dan em Jan 16 2023

imagem do blogue

Todos nós detestamos os momentos em que tentamos aceder a uma página e o sítio bloqueia o nosso pedido sem qualquer razão válida. O bloqueio geográfico, por exemplo, só pode ser ultrapassado através da utilização de um proxy. 

O Node-unblocker ajuda-nos a criar um proxy personalizado e a pô-lo a funcionar numa questão de minutos.

O que é o Node-Unblocker?

Node unblocker é uma biblioteca de uso geral para criar um proxy web, intercetar e alterar pedidos e respostas. 

Esta biblioteca também é utilizada na recolha de dados da Web para contornar as restrições implementadas pelo sítio, como o bloqueio geográfico, a ocultação do endereço IP e a limitação da taxa de transferência, ou para enviar tokens de autenticação. 

Para abreviar, ao utilizar esta biblioteca, pode dizer adeus aos conteúdos bloqueados e censurados.

Neste artigo, criamos um aplicativo Express com um proxy personalizado usando o Node Unblocker, adicionamos um middleware que altera o agente do usuário para cada solicitação, discutimos as limitações do proxy, implantamos no Heroku e comparamos com um serviço gerenciado como o WebScrapingAPI.

Pré-requisitos

Antes de começarmos, certifique-se de que tem a versão mais recente do Node.JS instalada. A instalação do Node.JS para cada plataforma (Windows, Linux, Mac) seria objeto de um artigo separado, pelo que, em vez de entrar em pormenores, consulte o sítio Web oficial e siga as instruções.

Preparar as coisas

Começamos por criar um diretório para o nosso projeto chamado unblocked e inicializamos um projeto Node.JS dentro dele:

mkdir unblocked
cd unblocked
npm init

Instalar dependências

Para esta aplicação, instalamos duas bibliotecas: Express, uma estrutura minimalista para Node.JS, e Node Unblocker.

npm install express unblocker

Criar a aplicação de base

Criar a aplicação Express

Devido ao facto de o node.unblocker ser executado dentro de uma instância Express, temos de configurar o exemplo Hello World na nossa aplicação.

Crie um ficheiro index.js e cole o seguinte código:

const express = require('express') const app = express() const port = 8080 app.get('/', (req, res) => { res.send('Hello World!') }) app.listen(process.env.PORT || 8080, () => { console.log(`Exemplo de aplicativo escutando na porta ${port}`) })

Podemos executar a aplicação com este comando:

node index.js

Se acedermos a http://localhost:8080, veremos uma mensagem Hello World. Isto significa que a nossa aplicação está a funcionar.

Adicionando o desbloqueador de nós ao Express

É altura de importar a biblioteca Node Unblock para a nossa aplicação:

var Unblocker = require('unblocker')

Criamos uma instância do node unbloker e passamos o parâmetro proxy. Pode encontrar a lista completa de parâmetros disponíveis aqui.

var unblocker = new Unblocker({prefix: '/proxy/'})

Registamos a biblioteca node unblocker no Express como um middleware para que os pedidos sejam interceptados:

app.use(unblocker)

Actualizamos o ouvinte de aplicações Express para adicionar suporte para websockets:

app.listen(process.env.PORT || 8080, () => { console.log(`Exemplo de aplicação a ouvir na porta ${port}`) }).on('upgrade', unblocker.onUpgrade)

Depois de seguir todos estes passos, a nossa aplicação deve ter o seguinte aspeto:

const express = require('express') const Unblocker = require('unblocker') const app = express() const port = 8080  const unblocker = new Unblocker({prefix: '/proxy/'})  app.use(unblocker)  app.get('/', (req, res) => {     res.send('Hello World!') })  app.listen(process.env.PORT || 8080, () => {     console.log(`Example app listening on port ${port}`) }).on('upgrade', unblocker.onUpgrade)

Testar o proxy

Reinicie a aplicação e aceda ao seguinte URL no seu navegador:

http://localhost:8080/proxy/https://webscrapingapi.com

Para garantir que o proxy funciona como esperado, abrimos as Ferramentas de desenvolvimento no browser e verificamos o separador Rede. Todos os pedidos devem passar pelo proxy.

imagem do blogue

Para quaisquer problemas que o proxy possa apresentar, recomenda-se ativar o modo de depuração definindo a variável de ambiente DEBUG. Use este comando para iniciar o proxy no modo de depuração:

DEBUG=unblocker:* node index.js

Nunca é uma boa ideia ativar isto na produção, por isso vamos mantê-lo apenas para o ambiente de desenvolvimento.

Utilização de middlewares

O Nodeunblocker não é apenas uma solução de proxy personalizada, mas permite a interceção e a alteração de pedidos de saída e de entrada através de middleware.

Podemos utilizar esta funcionalidade para bloquear o carregamento de recursos específicos com base no tipo de recurso ou domínio, atualizar o agente do utilizador, substituir o conteúdo devolvido ou injetar tokens de autenticação nos cabeçalhos dos pedidos.

Pode encontrar uma lista completa de exemplos aqui.

Vamos começar por criar um middleware para definir um agente de utilizador personalizado. Crie um arquivo chamado user-agent.js e adicione este código a ele:

module.exports = function(userAgent) {
function setUserAgent(data) {
data["headers"]["user-agent"] = userAgent
}
return setUserAgent
}

Esta função aceita o agente do utilizador personalizado com o parâmetro userAgent e regista-o no objeto de dados utilizando a função setUserAgent. O nó desbloqueado chamará a função setUserAgent com cada pedido.

const userAgent = require('./user-agent')

Definimos o requestMiddleware no construtor do Unblocker e estaremos prontos para começar.

const unblocker = new Unblocker({
prefix: '/proxy/',
requestMiddleware: [userAgent("nodeunblocker/1.5")]
})

O nosso ficheiro index.js deve ter o seguinte aspeto:

const express = require('express')
const Unblocker = require('unblocker')
const userAgent = require('./user-agent')
const app = express()
const port = 8080

const unblocker = new Unblocker({
prefix: '/proxy/',
requestMiddleware: [userAgent("nodeunblocker/1.5")]
})

app.use(unblocker)

app.get('/', (req, res) => {
res.send('Hello World!')
})

app.listen(process.env.PORT || 8080, () => {
console.log(`Example app listening on port ${port}`)
}).on('upgrade', unblocker.onUpgrade)

É altura de verificar se o nosso código funciona. Temos de alterar o URL do node-unblocker para garantir que os cabeçalhos são actualizados corretamente. 

Reinicie a aplicação e abra este URL no seu browser:

http://localhost:8080/proxy/https://www.whatsmyua.info/

Se o sítio apresentar nodeunblocker/1.5, o nosso middleware funciona.

imagem do blogue

Implementar no Heroku

Com nosso proxy em execução, é hora de implantá-lo no Heroku, uma plataforma como serviço (PaaS) que nos permite criar, lançar e gerenciar aplicativos totalmente na nuvem.

Tenha em mente que nem todos os provedores permitem proxies e aplicativos de raspagem da Web em sua infraestrutura. O Heroku aceita este tipo de aplicações, desde que as regras do robots.txt não sejam ignoradas.

Com a parte legal discutida, vamos preparar o nosso projeto para a implantação.

Script e motor

Temos de definir o script de arranque e os motores no ficheiro package.json.

A propriedade `engines` diz ao Heroku que precisamos da versão mais recente do Node.JS 16 instalada em nosso ambiente. O script de início é executado quando o ambiente é definido e nosso aplicativo está pronto para ser executado.

Nosso package.json deve se parecer com isso:

{
"name": "unblocked",
"version": "1.0.0",
"main": "index.js",
"engines": {
"node": "16.x"
},
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.18.1",
"unblocker": "^2.3.0"
}
}

O Heroku tornou a implantação de um aplicativo Node.JS uma maravilha. Antes de passar para a próxima secção, certifique-se de que instalou o Heroku CLI e as ferramentas git.

Início de sessão e configuração

Use este comando para autenticar com o Heroku a partir do seu terminal local:

login do heroku

Crie uma nova aplicação Heroku executando este comando:

heroku apps:create

Este comando retornará o ID do aplicativo e um repositório git. Vamos usar o ID para definir a origem remota do nosso repositório:

git init
heroku git:remote -a [SEU_APP_ID]

Como versionar a pasta node_modules nunca é uma boa ideia, vamos criar um arquivo .gitignore e adicionar a pasta a ele.

Implantar

O último passo antes do nosso código chegar à produção é fazer o commit e o deploy. Vamos adicionar todos os arquivos, criar um commit e fazer merge do branch master no branch do heroku.

git add .
git commit -am "Initial commit"
git push heroku master

Após alguns segundos, o aplicativo será implantado no Heroku. Parabéns! É hora de acessá-lo em nosso navegador e verificar se ele funciona.

Use a seguinte estrutura de URL para criar o URL do Heroku:

[HEROKU_DYNO_URL]/proxy/https://webscrapingapi.com

Se se esqueceu ou perdeu o URL Dyno, pode usar este comando para obter as informações disponíveis sobre a aplicação atual:

informações sobre o heroku

Limitações

A facilidade de configuração deste proxy personalizado tem um senão: funciona bem apenas para sítios simples e falha em tarefas avançadas. Algumas destas limitações são impossíveis de ultrapassar e exigirão a utilização de uma biblioteca diferente ou de serviços de terceiros.

Um serviço gerido como o WebScrapingAPI implementa correcções para todas estas limitações e adiciona algumas funcionalidades extra, como a resolução automática de captcha, proxies residenciais e evasões avançadas para impedir que serviços como a Akamai, a Cloudflare e a Datadome detectem o seu pedido. 

Aqui está uma lista de limitações que você deve conhecer antes de pensar em usar o Node Unblocker em seu projeto de produção.

Problemas com o OAuth

OAuth é o padrão de autenticação preferido por sites modernos como Facebook, Google, Youtube, Instagram, Twitter. Qualquer biblioteca que use postMessage não funcionará com o Node Unblocker e, talvez você já tenha adivinhado, o OAuth requer postMessage para funcionar corretamente.

Se quiser abdicar de 57% do tráfego da Internet só para utilizar esta biblioteca, pode ir em frente e adicioná-la ao seu projeto.

Sítios complexos

Sítios como o YouTube, HBO Max, Roblox, Discord e Instagram não funcionam e não há qualquer prazo para o lançamento de uma versão que permita que estes sítios funcionem. 

A comunidade é convidada a contribuir com correcções para resolver estes problemas, mas até que alguém crie um pedido pull, não será possível extrair quaisquer dados a partir deles.

Cloudflare

A Cloudflare oferece um serviço de deteção gratuito que é ativado por defeito em todas as contas. O nosso servidor proxy personalizado será detectado em segundos e será apresentada uma mensagem captcha no ecrã.

Cerca de 80% dos sítios utilizam a CDN da Cloudflare. Ter os seus pedidos bloqueados por captcha pode ser o fim do seu scraper.

Manutenção

Embora a criação de um proxy personalizado seja fácil, o trabalho de manutenção criará uma sobrecarga extremamente grande e desviará a sua atenção dos seus objectivos comerciais.

Terá de lidar com a execução das instâncias proxy, a criação de uma infraestrutura de escalonamento automático, o tratamento da concorrência e a gestão dos clusters. A lista é interminável.

Conclusão

Agora, você tem um proxy Web em execução no Heroku e um bom entendimento de como configurá-lo, como implantá-lo e suas limitações. Se estiver planejando usá-lo para um projeto de hobby, o Node Unblocker é uma boa escolha.

Mas estas desvantagens e o fraco apoio da comunidade impedem-no de o utilizar em qualquer aplicação pronta para produção.

Um serviço gerido como o WebScrapingAPI, que oferece acesso a um grande conjunto de proxies de centros de dados, móveis e residenciais, bem como a capacidade de jogar com a geolocalização, alterar cabeçalhos e criar cookies com um único parâmetro, não tem nenhuma destas limitações.

Notícias e actualizações

Mantenha-se atualizado com os mais recentes guias e notícias sobre raspagem da Web, subscrevendo a nossa newsletter.

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Artigos relacionados

miniatura
GuiasTutorial do Scrapy Splash: Dominando a arte de raspar sites renderizados em JavaScript com Scrapy e Splash

Aprenda a extrair sites dinâmicos renderizados em JavaScript usando o Scrapy e o Splash. Desde a instalação até à escrita de um spider, à manipulação da paginação e à gestão das respostas do Splash, este guia abrangente oferece instruções passo a passo tanto para principiantes como para especialistas.

Ștefan Răcila
avatar do autor
Ștefan Răcila
6 min. de leitura
miniatura
GuiasSaiba como contornar a deteção do Cloudflare com o melhor navegador Selenium

Saiba qual é o melhor browser para contornar os sistemas de deteção Cloudflare enquanto faz web scraping com o Selenium.

Mihnea-Octavian Manolache
avatar do autor
Mihnea-Octavian Manolache
9 min. de leitura
miniatura
GuiasDesbloqueie sítios Web e proteja a sua identidade com proxies e Axios Node.js

Saiba como usar proxies com Axios e Node.js para uma raspagem eficiente da Web. Dicas, exemplos de código e os benefícios de usar WebScrapingAPI incluídos.

Suciu Dan
avatar do autor
Suciu Dan
7 min. de leitura