Web Scraping con Ghost Cursor en 2025

Haz que tu web scraper sea menos detectable usando Ghost Cursor con Puppeteer. Descubre cómo configurarlo y utilizarlo para un scraping más humano.
9 min de lectura
Web Scraping with Ghost Cursor

En esta guía, aprenderás sobre el Cursor Fantasma. Cuando hayas terminado el tutorial, serás capaz de responder a las siguientes preguntas.

  • ¿Qué es el Cursor Fantasma?
  • ¿Con qué herramientas es compatible Ghost Cursor?
  • ¿Cómo se utiliza el Cursor Fantasma?
  • ¿Es compatible con herramientas de desbloqueo (proxies, navegadores remotos, etc.)?
  • ¿Cuándo es el Cursor Fantasma la elección correcta?

¿Qué es el Cursor Fantasma y por qué debería importarte?

Ghost Cursor es un plug-in para Puppeteer. Permite controlar el cursor del ratón y realizar interacciones con la página utilizando movimientos más parecidos a los humanos.

Cuando pulsas un botón con Puppeteer, el cursor se desplaza al botón instantáneamente y pulsa sobre él. Esto es muy robótico. Sí, es rápido y eficiente, pero es una de las muchas cosas que a menudo hace que te bloqueen cuando haces scraping en la web.

Cómo se mueve el cursor en Puppeteer

Con el Cursor Fantasma, creamos una cantidad infinita de puntos en una curva entre dos puntos de la página. A continuación, el cursor sigue esta curva desde su ubicación actual hasta su elemento de destino. Esta curva tiene un aspecto mucho más humano.

Cómo se mueve el cursor con el cursor fantasma

Primeros pasos

Antes de empezar a codificar, asumimos que tienes una familiaridad básica con JavaScript. En primer lugar, tenemos que crear una nueva carpeta de proyecto e inicializar un proyecto JavaScript.

El siguiente comando crea una nueva carpeta y salta al directorio de nuestro proyecto.

mkdir your-ghost-cursor-project
cd your-ghost-cursor-project

Puedes usar npm init para convertir esta nueva carpeta en un proyecto NodeJS. Usamos la bandera --y porque esto es un tutorial. No necesitamos una configuración impulsada con decisiones de licencia.

npm init --y

Ahora, instalamos nuestras dependencias. Bastante simple – sólo tenemos dos.

npm install ghost-cursor puppeteer

Uso básico del cursor fantasma

En el siguiente script, demostramos el uso básico de Ghost Cursor. Primero, lanzamos un navegador headful – esto no es un requisito, pero podrás ver Ghost Cursor en acción.

Después de crear una nueva página, la pasamos a installMouseHelper(). Esto nos permite ver el cursor moviéndose dentro de la página renderizada. A continuación, creamos un objeto cursor. El cursor obtiene la ubicación del libro y luego hace clic en él.

Por último, hacemos una captura de pantalla de la página del producto antes de cerrar el navegador y salir del programa.

const puppeteer = require('puppeteer');
const { createCursor, installMouseHelper } = require('ghost-cursor');

//this function holds our runtime
async function run() {

    //launch a headed browser to watch ghost cursor in action
    const browser = await puppeteer.launch({
        headless: false,
    });

    const page = await browser.newPage();

    //this allows you to watch the cursor as it moves around
    await installMouseHelper(page);

    //create the actual cursor object
    const cursor = createCursor(page);    

    await page.goto("https://books.toscrape.com");

    //find the link inside the product pod
    const book = await cursor.getElement("article[class='product_pod'] a");

    //get its location (x,y) coordinates
    const location = cursor.getLocation(book);

    //move to the coordinates
    await cursor.moveTo(location);

    //click on the book
    await cursor.click(book);

    //take a screenshot of the product page
    await page.screenshot({path: "book.png"});

    await browser.close();
}

run().catch(console.error);

Métodos disponibles en Cursor fantasma

Ahora que has visto el Cursor Fantasma en acción, echemos un vistazo a lo que hacen sus métodos individuales. Cada uno de ellos es una nueva pieza para su caja de herramientas de raspado.

instalarMouseHelper()

Usamos installMouseHelper() para seguir el movimiento del ratón dentro del navegador renderizado. Este método permite ver el cursor en acción. Esta pieza no es necesaria para el uso del cursor y necesita un navegador renderizado para ejecutarse. Esto es más una novedosa pieza de depuración que una herramienta útil.

//launch a headed browser to watch ghost cursor in action
const browser = await puppeteer.launch({
    headless: false,
});

const page = await browser.newPage();

//this allows you to watch the cursor as it moves around
await installMouseHelper(page);

getElement()

getElement() funciona prácticamente igual que page.$() en Puppeteer. De hecho, incluso pasamos elementos regulares de Puppeteer en otros métodos y el cursor tenía errores, pero seguía funcionando. Para encontrar un elemento en la pagina, es mejor usar cursor.getElement().

//find the link inside the product pod
const book = await cursor.getElement("article[class='product_pod'] a");

getLocation()

Una vez que ha encontrado un elemento, a menudo necesita recuperar su ubicación. Este método te permite recuperar las coordenadas (x,y) de cualquier elemento de la página con un código mínimo.

//get its location (x,y) coordinates
const location = cursor.getLocation(book);

mover()

move() es un método muy práctico. Puede pasar un objeto selector o un elemento de página directamente a move() y el cursor se moverá hacia él – naturalmente, como un humano.

//move straight to the book
await cursor.move(book);

//click on the book
await cursor.click(book);

moveTo()

moveTo permite pasar coordenadas directamente al cursor. En lugar de mover al libro, usamos getLocation() y pasamos su salida al cursor con moveTo().

//move to the coordinates
await cursor.moveTo(location);

//click on the book
await cursor.click(book);

scrollIntoView()

A veces, no se desea mover el cursor directamente sobre un objeto. ScrollIntoView() le permite pasar un selector o elemento de página y desplazarse hasta que su elemento aparezca dentro de la ventana gráfica.

//scroll until the book is in the viewport
await cursor.scrollIntoView(book);

//click on the book
await cursor.click(book);

scrollTo()

scrollTo() es otra muy conveniente. Te permite pasar arriba, abajo, izquierda y derecha. Controla tus movimientos de desplazamiento con lenguaje natural, ¡sin necesidad de IA!

//scroll to the top of the page
await cursor.scrollTo('top');

//click on the book
await cursor.click(book);

desplazarse()

scroll() es quizás la más básica de nuestras acciones de desplazamiento. Con scroll, pasas coordenadas (x,y) – ¿recuerdas getLocation()? Entonces el cursor se desplaza hasta que están dentro de la ventana gráfica.

//move to the coordinates
await cursor.scroll(location);

//click on the book
await cursor.click(book);

Limitaciones comunes del cursor fantasma

  • CAPTCHAs: Ghost Cursor pueden hacer que parezcas más humano, pero al fin y al cabo, sigues siendo tú quien controla el scraper. Echa un vistazo a los 10 mejores solucionadores de CAPTCHA para saber más.
  • Titiritero: Ghost cursor sólo soporta oficialmente Puppeteer. En comparación con otros navegadores sin cabeza como Selenium y Playwright, Puppeteer es bastante limitado y carente de características y mantenimiento.
  • Sólo local: El Cursor Fantasma necesita ejecutarse localmente. Esto limita mucho las opciones de desbloqueo. Con Scraping Browser, puede ejecutar navegadores remotos sin cabeza con gestión de proxy automatizada y resolución de CAPTCHA. Al no soportar la navegación remota, Ghost Cursor no puede aprovechar al máximo las mejores herramientas disponibles.

Integración de proxy

Aunque no soporta Scraping Browser, Puppeteer se integra con proxies locales. Puppeteer sigue la autenticación proxy estándar con su URL proxy básica, nombre de usuario y contraseña.

El codigo de abajo te da un script basico que puedes ajustar para cualquier tiempo de ejecucion de Puppeteer/Ghost Cursor. Asegúrese de reemplazar el nombre de usuario, el nombre de zona y la contraseña con sus propias credenciales.

const puppeteer = require('puppeteer');
const { createCursor } = require('ghost-cursor');

async function run() {
    const browser = await puppeteer.launch({
        headless: false,

        args: [
            '--proxy-server=http://brd.superproxy.io:33335',
            '--ignore-certificate-errors'
        ]

    });

    const page = await browser.newPage();

    const cursor = createCursor(page);

    await page.authenticate({
        username: "brd-customer-<your-username>-zone-<your-zone-name>",
        password: "<your-password>"
    });

    await page.goto("https://ipinfo.io");

    await cursor.click("a[href='/what-is-my-ip']");


    await page.screenshot({path: "ipinfo.png"});


    await browser.close();
}

run().catch(console.error);

Como ya se ha mencionado, con Puppeteer y Ghost Cursor no se puede sacar el máximo partido del propio Scraping Browser. El siguiente desglose muestra el coste de una sola ejecución utilizando el scraper anterior. El coste es realmente revelador.

Desglose de costes de Ghost Cursor con proxies

Cuando gestiones tus proxies manualmente, es mejor usar una rotación. Como puedes ver con Web Unlocker, este scrape cuesta 0.23$. Con una conexión residencial, fue de 0,05 dólares y con una conexión de centro de datos, sólo cuesta 0,01 dólares.

Cuando gestione proxies con Ghost Cursor y Puppeteer, utilice proxies del centro de datos cuando esten disponibles. Los proxies residenciales solo deben utilizarse cuando la conexión del centro de datos esté bloqueada por el sitio de destino.

Conclusión

Ghost Cursor es una forma sencilla y eficaz de hacer que tu scraper parezca más humano. Cuando tus desplazamientos y clics son más naturales, es menos probable que te bloqueen el sitio de destino. Esta herramienta funciona con integración proxy general, pero no es compatible con navegadores remotos.

Para las tareas básicas de scraping, Ghost Cursor puede añadir algo de humanidad a su código sin mucha repetición. Eche un vistazo a los productos de scraping mencionados en este artículo para mejorar su scraping hoy mismo.

  • Desbloqueador Web: Solución automatizada de CAPTCHA y gestión de proxy. Simplemente conéctelo y continúe codificando.
  • Navegador de raspado: Navegación remota con proxies gestionados y un solucionador CAPTCHA.
  • Proxies residenciales: Dirija su tráfico a través de conexiones de Internet domésticas reales en dispositivos de consumo. Mézclese con el mejor tráfico.
  • Proxies de centros de datos: hardware de gama alta con conexiones ultrarrápidas. Raspe sitios intermedios a bajo coste.

Solicite una prueba gratuita y empiece hoy mismo.