puppeteer js 中的多个 for 循环用于动态下拉抓取
Multiple for loops in puppeteer js for a dynamic drop down scrape
目前我正在抓取一个有多个下拉菜单的网页,每个下拉菜单都依赖于一个父下拉菜单。
我有三个变量,它们给出了每个下拉菜单的长度。
sizeLength, turnaroundLength, quantityLength
sizeLength = 32,turanroundlength = 2,quantityLength = 30
我首先需要将 sizeLength 设置为 1,然后将周转长度设置为 1,然后我需要遍历每个数量长度,总共 30 个。
为了实现这一点,我做了一些嵌套的 for 循环:
for (let i = 1; i <= sizeLength; i++) {
await page.evaluate( () => {
document.querySelector( '#size > option:nth-child('+i+')' ).selected = true} );
for (let x = 1; x <= turnaroundLength; x++) {
await page.evaluate( () => {
document.querySelector( '#turnaround > option:nth-child('+x+')' ).selected = true} );
}
for (let y = 1; y <= quantityLength; y++) {
await page.evaluate( () => {
document.querySelector( '#quantity > option:nth-child('+y+')' ).selected = true} );
}
console.log('this is in quantity');
}
}
使用这个方法我得到一个错误:await is only valid in async function。
我不确定如何解决这个问题,因为我是木偶操纵者的新手。任何建议将不胜感激,谢谢!
await
operator is used to wait for a Promise
, and it can only be used inside an async function
.
Puppeteer 函数 page.evaluate()
returns a promise, so you must wait for the promise to resolve
or reject
在继续循环的下一次迭代之前。
因此,您必须将代码包装在异步函数中才能使代码正常工作。
此外,由于现在编写了循环,因此您不会实现预期的行为,因为计数器没有传递给 page.evaluate()
。
您的代码应该如下所示:
( async () =>
{
const sizeLength = 32;
const turanroundlength = 2;
const quantityLength = 30;
for ( let i = 1; i <= sizeLength; i++ )
{
await page.evaluate( i =>
{
document.querySelector( '#size > option:nth-child(' + i + ')' ).selected = true;
}, i );
for ( let x = 1; x <= turnaroundLength; x++ )
{
await page.evaluate( x =>
{
document.querySelector( '#turnaround > option:nth-child(' + x + ')' ).selected = true;
}, x );
}
for ( let y = 1; y <= quantityLength; y++ )
{
await page.evaluate( y =>
{
document.querySelector( '#quantity > option:nth-child(' + y + ')' ).selected = true;
}, y );
}
console.log( 'this is in quantity' );
}
})();
目前我正在抓取一个有多个下拉菜单的网页,每个下拉菜单都依赖于一个父下拉菜单。
我有三个变量,它们给出了每个下拉菜单的长度。
sizeLength, turnaroundLength, quantityLength
sizeLength = 32,turanroundlength = 2,quantityLength = 30
我首先需要将 sizeLength 设置为 1,然后将周转长度设置为 1,然后我需要遍历每个数量长度,总共 30 个。
为了实现这一点,我做了一些嵌套的 for 循环:
for (let i = 1; i <= sizeLength; i++) {
await page.evaluate( () => {
document.querySelector( '#size > option:nth-child('+i+')' ).selected = true} );
for (let x = 1; x <= turnaroundLength; x++) {
await page.evaluate( () => {
document.querySelector( '#turnaround > option:nth-child('+x+')' ).selected = true} );
}
for (let y = 1; y <= quantityLength; y++) {
await page.evaluate( () => {
document.querySelector( '#quantity > option:nth-child('+y+')' ).selected = true} );
}
console.log('this is in quantity');
}
}
使用这个方法我得到一个错误:await is only valid in async function。 我不确定如何解决这个问题,因为我是木偶操纵者的新手。任何建议将不胜感激,谢谢!
await
operator is used to wait for a Promise
, and it can only be used inside an async function
.
Puppeteer 函数 page.evaluate()
returns a promise, so you must wait for the promise to resolve
or reject
在继续循环的下一次迭代之前。
因此,您必须将代码包装在异步函数中才能使代码正常工作。
此外,由于现在编写了循环,因此您不会实现预期的行为,因为计数器没有传递给 page.evaluate()
。
您的代码应该如下所示:
( async () =>
{
const sizeLength = 32;
const turanroundlength = 2;
const quantityLength = 30;
for ( let i = 1; i <= sizeLength; i++ )
{
await page.evaluate( i =>
{
document.querySelector( '#size > option:nth-child(' + i + ')' ).selected = true;
}, i );
for ( let x = 1; x <= turnaroundLength; x++ )
{
await page.evaluate( x =>
{
document.querySelector( '#turnaround > option:nth-child(' + x + ')' ).selected = true;
}, x );
}
for ( let y = 1; y <= quantityLength; y++ )
{
await page.evaluate( y =>
{
document.querySelector( '#quantity > option:nth-child(' + y + ')' ).selected = true;
}, y );
}
console.log( 'this is in quantity' );
}
})();