Node.js 是否有任何方法可以等待动态内容添加到页面之后。在Puppeter中单击()
我一直在写一个代码刮网站。 该网站是动态的,因此当我单击“显示更多”按钮时,它会加载用户拥有的其他徽章。因此,有没有一种方法可以让我单击该按钮,然后等待添加新内容,然后再将标记加载到cheerio中进行抓取 目前我只是让broswer等待3秒再重新单击,但这会使整个过程花费大量时间,如果浏览器无法在该时间内获取,也可能会失败 那么,除了这一点,还有其他选择吗? 请在下面找到我的代码-->Node.js 是否有任何方法可以等待动态内容添加到页面之后。在Puppeter中单击(),node.js,puppeteer,cheerio,Node.js,Puppeteer,Cheerio,我一直在写一个代码刮网站。 该网站是动态的,因此当我单击“显示更多”按钮时,它会加载用户拥有的其他徽章。因此,有没有一种方法可以让我单击该按钮,然后等待添加新内容,然后再将标记加载到cheerio中进行抓取 目前我只是让broswer等待3秒再重新单击,但这会使整个过程花费大量时间,如果浏览器无法在该时间内获取,也可能会失败 那么,除了这一点,还有其他选择吗? 请在下面找到我的代码--> 下面的代码适用于您的要求。我让它在进入while循环之前点击[first_button]的原因是第一个“sh
下面的代码适用于您的要求。我让它在进入while循环之前点击[first_button]的原因是第一个“show more”按钮实际上并没有发出网络请求
const go = async () => {
const browser = await puppeteer.launch({
headless: false,
args: [
"--no-sandbox",
"--disable-setuid-sandbox",
"--window-size=1600,1200"
],
defaultViewport: null
});
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
try {
await page.goto("https://trailblazer.me/id/akganesa", {
waitUntil: "networkidle2"
});
const [first_button] = await page.$x("//button[contains(., 'Show More')]");
await first_button.click();
while (
(await (await page.$x("//button[contains(., 'Show More')]")).length) > 0
) {
const [button] = await page.$x("//button[contains(., 'Show More')]");
await button.click();
await page.waitForResponse(response => response.status() === 200);
}
browser.close();
return;
} catch (err) {
console.log(err);
browser.close();
return;
}
};
go();
单击按钮是否生成网络请求?如果是,尝试使用waitForSelector吗?@hardkoded和mbit是的,我尝试过。我还尝试了waitForNavigation,但两者都返回了超时错误。1-->我已更新了上述代码以匹配您提供的答案,但此代码仅在再次显示后返回html。2-->您的答案可以正常工作,但不会返回页面内容。在所有加载完成后,我需要它继续执行所需任务。因此,您能帮我修复其中一个解决方案吗?NVM我找到了解决方案,但是,请务必让我知道如何从您的代码中返回page.content,因为我没有这样做。@Maverick
const html=wait page.content()
在browser.close()之前,然后将html
传递到您的cheerio函数中。如果要从函数返回html,请确保获取html并对其执行操作的函数标记为async,并在对其执行任何操作之前等待函数的结果。
const go = async () => {
const browser = await puppeteer.launch({
headless: false,
args: [
"--no-sandbox",
"--disable-setuid-sandbox",
"--window-size=1600,1200"
],
defaultViewport: null
});
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
try {
await page.goto("https://trailblazer.me/id/akganesa", {
waitUntil: "networkidle2"
});
const [first_button] = await page.$x("//button[contains(., 'Show More')]");
await first_button.click();
while (
(await (await page.$x("//button[contains(., 'Show More')]")).length) > 0
) {
const [button] = await page.$x("//button[contains(., 'Show More')]");
await button.click();
await page.waitForResponse(response => response.status() === 200);
}
browser.close();
return;
} catch (err) {
console.log(err);
browser.close();
return;
}
};
go();