Web Automation to go to next page - Invoking method that returns Promise within await block) - await is only valid in async
Web Automation to go to the next page - Invoking method that returns Promise within await block) - await is only valid in async
背景:
我正在用 puppeteer 编写一个 Nodejs 脚本来从网页中抓取数据。我不熟悉 Nodejs、promises 或 puppeteer。我已经尝试了很多东西并做了几天的研究。
申请流程:
- 通过自动化,转到网站
- 从页面抓取数据,推送到数组
- 如果有"next page"点击下一页按钮
- 从页面抓取数据,推送到同一个数组
- 重复
问题:
我的问题是#3。使用 Web 自动化,单击下一页按钮。
我想要的只是在 puppeteer 中使用 .click() 方法,单击按钮选择器。但是,.click() returns 一个承诺。因为这是一个承诺,我需要关键字 await
,但你不能在 for 循环(或 async
以外的任何块)中使用 await
。
我尝试了什么:
我已经尝试创建另一个 async
函数,使用 await page.click();
的语句并在问题区域调用该函数。我尝试使用 page.click() 创建一个常规函数并在问题区域调用它。重构一切以使其无法正常工作。即使在阅读了几天后,我也不是很了解 Promises 和 Async/Await。
我需要什么帮助:
帮助调用问题区域内的 .click() 方法或帮助选择 'Next Page' 使用 Web 自动化。
伪代码:
let scrape = async () => {
await //do.some.automation;
const result = await page.evaluate(() => {
for (looping each page) {
if (there is a next page) {
for (loop through data) {
array.push(data);
//----PROBLEM----
//use automation to click the selector of the next page button
//--------------
}
}
}
return data;
});
//close browser
return result;
};
scrape().then((value) => {
//output data here;
});
});
所有代码:
let scrape = async () => {
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
await page.goto("GO TO A WEBSITE");
await page.click("CLICK A BUTTON");
await page.waitFor(2000);
//Scraping
const result = await page.evaluate(() => {
let pages = document.getElementsByClassName("results-paging")[2];
let allPages = pages.getElementsByClassName("pagerLink");
let allJobs = [];
//Loop through each page
for (var j = 0; j < allPages.length; j++) {
let eachPage = pages.getElementsByClassName("pagerLink")[j].innerHTML;
if (eachPage) {
//Scrape jobs on single page
let listSection = document.getElementsByTagName("ul")[2];
let allList = listSection.getElementsByTagName("li");
for (var i = 0; i < allList.length; i++) {
let eachList = listSection.getElementsByTagName("li")[i].innerText;
allJobs.push(eachList);
//--------PROBLEM-------------
await page.click('#selector_of_next_page');
//----------------------------
}
}
else {
window.alert("Fail");
}
}
return allJobs;
});
browser.close();
return result;
};
scrape().then((value) => {
let data = value.join("\r\n");
console.log(data);
fs.writeFile("RESULTS.txt", data, function (err) {
console.log("SUCCESS MESSAGE");
});
});
错误信息:
SyntaxError: await is only valid in async function
您不能在 page.evaluate
函数中使用 page
方法。
根据您的示例,您应该更改
await page.click('#selector_of_next_page');
相当于原生 JS
document.getElementById('selector_of_next_page').click();
背景:
我正在用 puppeteer 编写一个 Nodejs 脚本来从网页中抓取数据。我不熟悉 Nodejs、promises 或 puppeteer。我已经尝试了很多东西并做了几天的研究。
申请流程:
- 通过自动化,转到网站
- 从页面抓取数据,推送到数组
- 如果有"next page"点击下一页按钮
- 从页面抓取数据,推送到同一个数组
- 重复
问题:
我的问题是#3。使用 Web 自动化,单击下一页按钮。
我想要的只是在 puppeteer 中使用 .click() 方法,单击按钮选择器。但是,.click() returns 一个承诺。因为这是一个承诺,我需要关键字 await
,但你不能在 for 循环(或 async
以外的任何块)中使用 await
。
我尝试了什么:
我已经尝试创建另一个 async
函数,使用 await page.click();
的语句并在问题区域调用该函数。我尝试使用 page.click() 创建一个常规函数并在问题区域调用它。重构一切以使其无法正常工作。即使在阅读了几天后,我也不是很了解 Promises 和 Async/Await。
我需要什么帮助:
帮助调用问题区域内的 .click() 方法或帮助选择 'Next Page' 使用 Web 自动化。
伪代码:
let scrape = async () => {
await //do.some.automation;
const result = await page.evaluate(() => {
for (looping each page) {
if (there is a next page) {
for (loop through data) {
array.push(data);
//----PROBLEM----
//use automation to click the selector of the next page button
//--------------
}
}
}
return data;
});
//close browser
return result;
};
scrape().then((value) => {
//output data here;
});
});
所有代码:
let scrape = async () => {
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
await page.goto("GO TO A WEBSITE");
await page.click("CLICK A BUTTON");
await page.waitFor(2000);
//Scraping
const result = await page.evaluate(() => {
let pages = document.getElementsByClassName("results-paging")[2];
let allPages = pages.getElementsByClassName("pagerLink");
let allJobs = [];
//Loop through each page
for (var j = 0; j < allPages.length; j++) {
let eachPage = pages.getElementsByClassName("pagerLink")[j].innerHTML;
if (eachPage) {
//Scrape jobs on single page
let listSection = document.getElementsByTagName("ul")[2];
let allList = listSection.getElementsByTagName("li");
for (var i = 0; i < allList.length; i++) {
let eachList = listSection.getElementsByTagName("li")[i].innerText;
allJobs.push(eachList);
//--------PROBLEM-------------
await page.click('#selector_of_next_page');
//----------------------------
}
}
else {
window.alert("Fail");
}
}
return allJobs;
});
browser.close();
return result;
};
scrape().then((value) => {
let data = value.join("\r\n");
console.log(data);
fs.writeFile("RESULTS.txt", data, function (err) {
console.log("SUCCESS MESSAGE");
});
});
错误信息:
SyntaxError: await is only valid in async function
您不能在 page.evaluate
函数中使用 page
方法。
根据您的示例,您应该更改
await page.click('#selector_of_next_page');
相当于原生 JS
document.getElementById('selector_of_next_page').click();