为什么我不能将数据推送到块 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
函数都是异步的,需要 await
ed。
第二种方法是 return 来自 page.evaluate
的数组,这更简单。
const codes = await page.evaluate(() => {
const codes = [];
// code here
return codes;
});
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
函数都是异步的,需要 await
ed。
第二种方法是 return 来自 page.evaluate
的数组,这更简单。
const codes = await page.evaluate(() => {
const codes = [];
// code here
return codes;
});