为什么我不能将数据推送到块 page.evaluate puppeteer 爬虫内的数组中?

Why I can't push data into an array inside block page.evaluate puppeteer crawler?

var codes = [];    
await page.evaluate((codes) => {
    $(".offers-details").each(function (i, e) {
        if ($(e).find('.coupon-code').length > 0) {
            console.log($(e).find('.coupon-code .btn-copy').attr('data-clipboard-text'));
            codes.push($(e).find('.coupon-code .btn-copy').attr('data-clipboard-text'));
        }
    });
}, codes);

如何在 handlePageFunction 中的 page.evaluate() 之外使用 jQuery? 我只想在这里使用jQuery。
当我在 handlePageFunction 中使用它时,它不起作用。 如何解决?

page.evaluate 是一个在浏览器内执行的 Puppeteer 函数,这就是您访问全局 $ 变量(附加到 window 变量)的方式。

虽然您不能在浏览器之外使用 jQuery,但您可以使用 Puppeteer 中的所有选择器函数:https://pptr.dev/#?product=Puppeteer&version=v5.2.1&show=api-pageselector

包括:

  • page.$ 用于单个元素(return如果未找到则为 null)
  • page.$$ 用于多个元素(总是 return 一个数组)

您可以 manipulate/read/interact 使用这些函数的 return 类型,在您的情况下,将是这样的(未测试!):

  const offersDetails = await page.$$(".offers-details");
  const codes = [];

  for (const offerDetail of offersDetails) {
     const couponCode = await offerDetail.$('.coupon-code');

     if (couponCode) {
       const cpText = await couponCode.$eval('.btn-copy', (el) => el.attributes('data-clipboard-text'));
       console.log(cpText);
       codes.push(cpText);
     }
  }

注意所有 page 函数都是异步的,需要 awaited。

第二种方法是 return 来自 page.evaluate 的数组,这更简单。

const codes = await page.evaluate(() => {
   const codes = [];
   // code here
   return codes;
});