es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué phantomJS 2.1.1 representa esta página como color de fondo sin contenido, pero foxshot 1.2.0 la representa correctamente?

Me gusta llevar un seguimiento de los resultados de la lotería de Massachusetts (asegurándome de que los resultados sean realmente aleatorios). Puedo abrir la página de resultados en cualquier navegador y copiar y pegar las líneas de texto, y ejecutar el texto a través de un filtro escrito en php o gawk para extraer los números de cada fecha. Pero pensé que sería mejor automatizar el proceso utilizando phantomJS para obtener las fechas y los números directamente del DOM.

No he podido hacer que esto funcione porque los elementos que contienen los resultados no parecen estar en el DOM accesible a través de phantomJS. No sé si estoy haciendo algo mal (probablemente lo estoy haciendo) o si es un problema con phantomJS (que sé que ya no se mantiene). Pero también intenté utilizar el ejemplo de renderizar una URL a una imagen .png directamente desde el ejemplo de Carga de página en el inicio rápido, y la imagen salió sólo en color de fondo sin texto, así que estoy pensando que es un problema con phantomJS. ¿O necesita ese ejemplo algún código adicional para esperar a que se completen todos los scripts incluidos?

Aquí está el ejemplo de JavaScript con la URL en cuestión y el nombre del archivo de imagen codificado:

var page = require('webpage').create();
page.open('https://www.masslottery.com/tools/past-results/mega-millions?start_date=2021-09-03&end_date=2021-09-28', function(status) {
    console.log("Estado: " + status);
    if(status === "success") {
        page.render('example.png');
    }
    phantom.exit();
});

Ejecutar phantomjs en el JavaScript anterior produce este archivo llamado example.png de la siguiente manera:

example.png

Pero al ejecutar foxshot, veo lo siguiente:

$ foxshot 'https://www.masslottery.com/tools/past-results/mega-millions?start_date=2021-09-03&end_date=2021-09-28'
no se proporcionaron dimensiones válidas, se establece en 1024x768 por defecto
cargando el sitio...
1024x768

Y produce un archivo llamado screenshot_1024x768.png de la siguiente manera:

screenshot_1024x768.png

Por supuesto, foxshot no proporciona una forma de acceder al DOM o de otra manera acceder al texto mostrado en la imagen. ¿Algún consejo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Recomendación de Solución

    Según la información proporcionada, parece que phantomJS puede no ser la mejor herramienta para automatizar el proceso de extracción de los resultados de lotería del DOM. Dado que phantomJS ya no se mantiene, es posible que no admita las últimas tecnologías utilizadas en el sitio web de la lotería.

    Una solución alternativa podría ser el uso de un navegador sin cabeza como Puppeteer, que se mantiene activamente y proporciona una solución más actualizada. Puppeteer es una biblioteca de Node que proporciona una API de alto nivel para controlar Chrome o Chromium sin cabeza, lo que significa que se puede usar para interactuar con el DOM y extraer datos según sea necesario.

    Aquí hay un ejemplo que usa Puppeteer para navegar a la página de resultados de lotería de Massachusetts, extraer los números de lotería y las fechas, e imprimirlos en la consola:

    const puppeteer = require('puppeteer');
    
    (async () => {
      const browser = await puppeteer.launch({ headless: true });
      const page = await browser.newPage();
    
      await page.goto('https://www.masslottery.com/tools/past-results/mega-millions?start_date=2021-09-03&end_date=2021-09-28', { waitUntil: 'networkidle0' });
    
      // Extract lotto results
      const results = await page.evaluate(() => {
        const rows = Array.from(document.querySelectorAll('table.table > tbody > tr'));
        return rows.map(row => {
          const [date, num1, num2, num3, num4, num5, mega] = Array.from(row.querySelectorAll('td')).map(td => td.innerText.trim());
          return { date, numbers: [num1, num2, num3, num4, num5, mega] };
        });
      });
    
      console.log(results);
    
      await browser.close();
    })();
    

    Este código usa Puppeteer para navegar a la página de resultados de lotería, espera a que la página se cargue por completo y luego extrae los números de lotería y las fechas de la tabla utilizando page.evaluate(). Los resultados se imprimen en la consola.

    En general, el uso de un navegador sin cabeza como Puppeteer proporciona una solución más potente y actualizada para automatizar el proceso de extracción de datos del DOM en comparación con el uso de phantomJS.

Comments are closed.