Desbloqueador de nodos para Web Scraping

Suciu Dan el 16 Ene 2023

blog-image

Todos odiamos los momentos en los que intentamos acceder a una página y el sitio bloquea nuestra petición sin una buena razón. El geobloqueo, por ejemplo, sólo se puede pasar utilizando un proxy. 

Node-unblocker nos ayuda a crear un proxy personalizado y tenerlo funcionando en cuestión de minutos.

¿Qué es Node-Unblocker?

Node unblocker es una librería de propósito general para crear un proxy web, interceptar y alterar peticiones y respuestas. 

Esta biblioteca también se utiliza en el web scraping para eludir las restricciones implementadas por el sitio como el geo-bloqueo, ocultando la dirección IP y la limitación de velocidad, o para el envío de tokens de autenticación. 

Para abreviar, al utilizar esta biblioteca, puede despedirse de los contenidos bloqueados y censurados.

En este artículo, creamos una aplicación Express con un proxy personalizado usando Node Unblocker, añadimos un middleware que cambia el agente de usuario para cada petición, discutimos las limitaciones del proxy, lo desplegamos en Heroku y lo comparamos con un servicio gestionado como WebScrapingAPI.

Requisitos previos

Antes de empezar, asegúrate de que tienes instalada la última versión de Node.JS. Instalar Node.JS para cada plataforma (Windows, Linux, Mac) sería objeto de un artículo aparte, así que en lugar de entrar en detalles, consulta el sitio web oficial y sigue las instrucciones.

Preparación

Comenzamos creando un directorio para nuestro proyecto llamado unblocked e inicializamos un proyecto Node.JS dentro de él:

mkdir desbloqueado
cd desbloqueado
npm init

Instalar dependencias

Para esta aplicación, instalamos dos librerías: Express, un framework minimalista para Node.JS, y Node Unblocker.

npm install express unblocker

Crear la aplicación base

Creación de la aplicación Express

Debido a que node.unblocker se ejecuta dentro de una instancia Express, tenemos que configurar el ejemplo Hola Mundo en nuestra aplicación.

Crea un archivo index.js y pega el siguiente código:

const express = require('express') const app = express() const port = 8080 app.get('/', (req, res) => { res.send('¡Hola Mundo!') }) app.listen(process.env.PORT || 8080, () => { console.log(`Aplicación de ejemplo escuchando en el puerto ${port}`) })

Podemos ejecutar la aplicación con este comando:

node index.js

Si accedemos a http://localhost:8080 veremos un mensaje de Hola Mundo. Esto significa que nuestra aplicación está funcionando.

Añadir Node Unblocker a Express

Es hora de importar la librería Node Unblock a nuestra aplicación:

var Unblocker = require('unblocker')

Creamos una instancia de nodo unbloker y le pasamos el parámetro proxy. Puedes encontrar la lista completa de parámetros disponibles aquí.

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

Registramos la librería node unblocker en Express como middleware para que las peticiones sean interceptadas:

app.use(unblocker)

Actualizamos la escucha de aplicaciones Express para añadir compatibilidad con websockets:

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

Después de seguir todos estos pasos, nuestra aplicación debería tener este aspecto:

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)

Probar el proxy

Reinicie la aplicación y acceda a la siguiente URL en su navegador:

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

Para asegurarnos de que el proxy funciona como se espera, abrimos las Herramientas de desarrollo en el navegador y comprobamos la pestaña Red. Todas las peticiones deberían pasar por el proxy.

blog-image

Para cualquier problema que el proxy pueda arrojar, se recomienda habilitar el modo de depuración estableciendo la variable de entorno DEBUG. Utilice este comando para iniciar el proxy en modo de depuración:

DEBUG=unblocker:* nodo index.js

Nunca es una buena idea activar esto en producción, así que vamos a mantenerlo sólo para el entorno de desarrollo.

Uso de middlewares

Nodeunblocker no es sólo una solución proxy personalizada, sino que permite interceptar y alterar las peticiones salientes y entrantes a través de middleware.

Podemos utilizar esta función para bloquear la carga de recursos específicos en función del tipo de recurso o dominio, actualizar el agente de usuario, reemplazar el contenido devuelto o inyectar tokens de autenticación en las cabeceras de las solicitudes.

Aquí encontrará una lista completa de ejemplos.

Empecemos por crear un middleware para establecer un agente de usuario personalizado. Crea un archivo llamado user-agent.js y añádele este código:

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

Esta función acepta el agente de usuario personalizado con el parámetro userAgent y lo registra en el objeto de datos utilizando la función setUserAgent. Nodo desbloqueado llamará a la función setUserAgent con cada solicitud.

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

Establecemos el requestMiddleware en el constructor de Unblocker y ya podemos empezar.

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

Nuestro archivo index.js debería tener este aspecto:

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)

Es hora de comprobar si nuestro código funciona. Tenemos que cambiar la URL de node-unblocker para asegurarnos de que las cabeceras se actualizan correctamente. 

Reinicie la aplicación y abra esta URL en su navegador:

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

Si el sitio muestra nodeunblocker/1.5, nuestro middleware funciona.

blog-image

Despliegue en Heroku

Con nuestro proxy en funcionamiento, es hora de desplegarlo en Heroku, una plataforma como servicio (PaaS) que nos permite crear, lanzar y gestionar aplicaciones totalmente en la nube.

Ten en cuenta que no todos los proveedores permiten proxies y aplicaciones de web scraping en su infraestructura. Heroku acepta este tipo de aplicaciones siempre que no se ignoren las reglas de robots.txt.

Una vez discutida la parte legal, preparemos nuestro proyecto para el despliegue.

Guión y motor

Tenemos que establecer el script de inicio y los motores en el archivo package.json.

La propiedad `engines` indica a Heroku que necesitamos la última versión de Node.JS 16 instalada en nuestro entorno. El script de inicio se ejecuta cuando el entorno está configurado y nuestra aplicación está lista para ejecutarse.

Nuestro package.json debería tener este aspecto:

{
"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"
}
}

Heroku ha hecho que el despliegue de una aplicación Node.JS sea una maravilla. Antes de pasar a la siguiente sección, asegúrate de haber instalado la CLI de Heroku y las herramientas git.

Inicio de sesión y configuración

Utilice este comando para autenticarse con Heroku desde su terminal local:

heroku login

Crea una nueva aplicación Heroku ejecutando este comando:

heroku apps:crear

Este comando devolverá el ID de la aplicación y un repositorio git. Vamos a utilizar el ID para establecer el origen remoto de nuestro repositorio:

git init
heroku git:remote -a [YOUR_APP_ID]

Como versionar la carpeta node_modules nunca es una buena idea, creemos un archivo .gitignore y añadamos la carpeta a él.

Despliegue

El último paso antes de que nuestro código llegue a producción es confirmarlo y desplegarlo. Vamos a añadir todos los archivos, crear un commit y fusionar la rama maestra en la rama heroku.

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

Después de unos segundos, la aplicación se desplegará en Heroku. ¡Enhorabuena! Es hora de acceder a ella en nuestro navegador y comprobar que funciona.

Utilice la siguiente estructura de URL para construir la URL de Heroku:

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

Si has olvidado o perdido la URL de Dyno, puedes utilizar este comando para obtener la información disponible sobre la aplicación actual:

heroku info

Limitaciones

La facilidad de configuración de este proxy personalizado viene con una advertencia: sólo funciona bien para sitios sencillos y falla para tareas avanzadas. Algunas de estas limitaciones son imposibles de superar y requerirán el uso de una biblioteca diferente o servicios de terceros.

Un servicio gestionado como WebScrapingAPI implementa correcciones para todas estas limitaciones y añade algunas funciones adicionales como la resolución automática de captchas, proxies residenciales y evasiones avanzadas para evitar que servicios como Akamai, Cloudflare y Datadome detecten su solicitud. 

Aquí tienes una lista de limitaciones que deberías conocer antes de pensar en usar Node Unblocker en tu proyecto de producción.

Problemas con OAuth

OAuth es el estándar de autenticación preferido por sitios modernos como Facebook, Google, Youtube, Instagram, Twitter. Cualquier librería que utilice postMessage no funcionará con Node Unblocker y, quizás ya lo hayas adivinado, OAuth requiere postMessage para funcionar correctamente.

Si quieres renunciar al 57% del tráfico de Internet sólo por utilizar esta biblioteca, puedes seguir adelante y añadirla a tu proyecto.

Sitios complejos

Sitios como YouTube, HBO Max, Roblox, Discord, Instagram no funcionan y no hay plazo para lanzar una versión que haga que estos sitios funcionen. 

Se invita a la comunidad a contribuir con parches para solucionar estos problemas, pero hasta que alguien no cree un pull request, no se podrá extraer ningún dato de ellos.

Cloudflare

Cloudflare ofrece un servicio de detección gratuito que se activa por defecto en todas las cuentas. Nuestro servidor proxy personalizado se detectará en segundos y aparecerá un mensaje captcha en la pantalla.

Alrededor del 80% de los sitios utilizan la CDN de Cloudflare. Tener tus peticiones bloqueadas por captcha puede ser el fin de tu scraper.

Mantenimiento

Aunque configurar un proxy personalizado es fácil, el trabajo de mantenimiento generará unos gastos generales muy elevados y le desviará de sus objetivos empresariales.

Tendrás que ocuparte de ejecutar las instancias proxy, configurar una infraestructura de autoescalado, lidiar con la concurrencia y gestionar los clústeres. La lista es interminable.

Conclusión

Ahora tienes un proxy web ejecutándose en Heroku y una buena comprensión de cómo configurarlo, cómo desplegarlo y sus limitaciones. Si estás planeando usarlo para un proyecto de hobby, Node Unblocker es una buena opción.

Pero estos inconvenientes y el escaso apoyo de la comunidad impiden utilizarlo en cualquier aplicación lista para producción.

Un servicio gestionado como WebScrapingAPI, que ofrece acceso a un gran conjunto de proxies de centros de datos, móviles y residenciales, así como la posibilidad de jugar con la geolocalización, cambiar cabeceras y crear cookies con un solo parámetro, no tiene ninguna de estas limitaciones.

Noticias y actualidad

Manténgase al día de las últimas guías y noticias sobre raspado web suscribiéndose a nuestro boletín.

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

Artículos relacionados

miniatura
GuíasTutorial de Scrapy Splash: Dominar el arte del scraping de sitios web renderizados en JavaScript con Scrapy y Splash

Aprenda a scrapear sitios web dinámicos con JavaScript utilizando Scrapy y Splash. Desde la instalación hasta la escritura de una araña, el manejo de la paginación y la gestión de las respuestas de Splash, esta completa guía ofrece instrucciones paso a paso tanto para principiantes como para expertos.

Ștefan Răcila
avatar de autor
Ștefan Răcila
6 min leer
miniatura
GuíasAprenda a eludir la detección de Cloudflare con el mejor navegador Selenium

Conozca cuál es el mejor navegador para eludir los sistemas de detección de Cloudflare mientras hace web scraping con Selenium.

Mihnea-Octavian Manolache
avatar de autor
Mihnea-Octavian Manolache
9 min leer
miniatura
GuíasDesbloquea sitios web y protege tu identidad con proxies y Axios Node.js

Aprende a usar proxies con Axios y Node.js para un raspado web eficiente. Consejos, ejemplos de código y los beneficios de usar WebScrapingAPI incluidos.

Suciu Dan
avatar de autor
Suciu Dan
7 min leer