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.

Cómo compartir cookies entre múltiples ejecuciones de Apify SDK crawlers 1. En primer lugar, asegúrese de tener instalado el Apify SDK en su entorno de desarrollo. 2. Una vez que tenga el SDK instalado, abra el script del crawler que desea configurar para compartir cookies. 3. Dentro del script, asegúrese de tener la siguiente importación al comienzo del archivo: “`javascript const Apify = require(‘apify’); “` 4. A continuación, agregue el siguiente fragmento de código para utilizar el almacén de cookies compartido entre ejecuciones: “`javascript const { utils: { puppeteer } } = Apify; Apify.main(async () => { // Configuración del almacenamiento de cookies compartido const cookieJar = await Apify.openCookieJar(); // Inicialización del crawler const crawler = new Apify.PuppeteerCrawler({ cookieJar, // Resto de la configuración del crawler }); // Ejecutar el crawler await crawler.run(); }); “` 5. Con el código anterior, el Apify SDK configurará automáticamente un almacenamiento de cookies compartido entre cada ejecución del crawler, lo que le permitirá compartir cookies entre runs. 6. Asegúrese de que su crawler esté utilizando instancias de `PuppeteerCrawler` y configure `cookieJar` usando el objeto del almacenamiento de cookies compartido. Con estos pasos, habrá configurado correctamente el compartir cookies entre múltiples ejecuciones de Apify SDK crawlers.

Con Apify, estoy intentando extraer resultados de búsqueda de un sitio que requiere iniciar sesión:
1. Obtener la página de inicio de sesión para obtener el token de inicio de sesión (es un campo oculto en el formulario de inicio de sesión).
2. Hacer una solicitud que simule el inicio de sesión.
3. Realizar una búsqueda en el sitio para verificar cuántas páginas de resultados de búsqueda hay.
4. Rastrear cada página de resultados de búsqueda.

Lo que me resulta difícil de resolver es cómo compartir las mismas cookies (también conocidas como sesión) entre los pasos 1-4. Lo que preferiría es una separación clara en mi código, como esta:

Apify.main(async () => {
  await clearApifyCache();

  // ¿Qué debería ser este código para permitir compartir sesiones
  // entre cada paso del rastreo?
  const context = ?????

  const loginToken = await getLoginToken(context);  // Paso 1
  await login(context, loginToken); // Paso 2
  const pageCount = await getPageCount(context); // Paso 3
  const results = await getJobList(context, pageCount); // Paso 4

  await Promise.all([writeCsv(results), writeHtml(results)]);
});

Podría construir esto más como una máquina de estados, donde hay una única instancia de Apify.CheerioCrawler y cada solicitud agrega la(s) siguiente(s) solicitud(es) a la RequestQueue. Probablemente incluso podría simular el flujo de código deseado haciendo que handlePageFunction recorra una función generadora. Lo cual es probablemente lo que intentaré a continuación.

Pero ¿hay una forma más sencilla de mantener un flujo más simple y procedural utilizando async/await regular? No importa si no hay ninguna, solo me preguntaba si me estaba perdiendo una forma obvia de compartir el estado de la sesión entre diferentes ejecuciones del mismo rastreador o entre diferentes instancias del rastreador. Por cierto, solo estoy rastreando ~20 páginas, así que el rendimiento no es un gran problema.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para compartir cookies (sesiones) entre los pasos 1-4 en Apify, puedes utilizar la utilidad EnqueueLinks para agregar todas las páginas que deseas rastrear a la RequestQueue, y luego utilizar la función Apify.utils.puppeteer.enqueueLinks() para agregar los resultados de búsqueda de cada página a la cola también. Aquí tienes un ejemplo de flujo de código que demuestra esto:

    const Apify = require('apify');
    const { enqueueLinks } = Apify.utils;
    
    Apify.main(async () => {
      const requestQueue = await Apify.openRequestQueue();
      const loginToken = await getLoginToken(); // Paso 1
      const cookies = await login(loginToken); // Paso 2
      const pageCount = await getPageCount(cookies); // Paso 3
    
      // Agregar todas las páginas de resultados de búsqueda a la cola
      const searchResultUrls = getSearchResultUrls(pageCount);
      await enqueueLinks({
        puppeteerRequestQueue: requestQueue,
        links: searchResultUrls,
        cookies,
      });
    
      // Rastrear todas las páginas de resultados de búsqueda
      const crawler = new Apify.CheerioCrawler({
        requestQueue,
        handlePageFunction: async ({ request, $ }) => {
          const results = getResults($);
          await saveResults(results);
    
          // Agregar los resultados de búsqueda de la siguiente página a la cola
          const nextPageUrl = getNextPageUrl($);
          if (nextPageUrl) {
            await enqueueLinks({
              puppeteerRequestQueue: requestQueue,
              links: [nextPageUrl],
              cookies,
            });
          }
        },
      });
    
      await crawler.run();
    });
    

    En este flujo de código, getLoginToken() recupera el token de inicio de sesión de la página de inicio de sesión, y login(loginToken) inicia sesión en el sitio y devuelve las cookies. getPageCount(cookies) devuelve el número total de páginas de resultados de búsqueda en el sitio, y getSearchResultUrls(pageCount) genera las URL para todas las páginas de resultados de búsqueda.

    Después de obtener las cookies, utilizas enqueueLinks() para agregar todas las páginas de resultados de búsqueda a la RequestQueue. Como pasas el objeto cookies a enqueueLinks(), cada página se cargará con la misma sesión que la página de inicio de sesión.

    Luego creas una instancia de CheerioCrawler y especificas una función controladora que extrae los resultados de búsqueda de la página y los guarda en algún lugar (saveResults()). Si hay otra página de resultados, utilizas enqueueLinks() nuevamente para agregarla a la RequestQueue.

    Debido a que cada solicitud en la RequestQueue se cargará con la misma sesión, puedes compartir cookies entre todos los pasos sin problemas.

Comments are closed.