如何在 Puppeteer 中重新加载页面?
How to reload page in Puppeteer?
每当页面加载不正确或遇到问题时,我想重新加载页面。我尝试了 page.reload()
但它不起作用。
for(const sect of sections ){
// Now collect all the URLs
const appUrls = await page.$$eval('div.main > ul.app-list > li > div.app-info a.app-info-icon', links => links.map(link => link.href));
// Visit each URL one by one and collect the data
for (let appUrl of appUrls) {
var count = i++;
try{
await page.goto(appUrl);
const appName = await page.$eval('div.det-name-int', div => div.innerText.trim());
console.log('\n' + count);
console.log(appName);
} catch(e){
console.log('\n' + count);
console.log('ERROR', e);
await page.reload();
}
}
}
它给我这个错误:
ERROR Error: Error: failed to find element matching selector "div.det-name-int"
at ElementHandle.$eval (C:\Users\Administrator\node_modules\puppeteer\lib\JS
Handle.js:418:13)
at process._tickCallback (internal/process/next_tick.js:68:7)
-- ASYNC --
at ElementHandle.<anonymous> (C:\Users\Administrator\node_modules\puppeteer\
lib\helper.js:108:27)
at DOMWorld.$eval (C:\Users\Administrator\node_modules\puppeteer\lib\DOMWorl
d.js:149:21)
at process._tickCallback (internal/process/next_tick.js:68:7)
-- ASYNC --
at Frame.<anonymous> (C:\Users\Administrator\node_modules\puppeteer\lib\help
er.js:108:27)
at Page.$eval (C:\Users\Administrator\node_modules\puppeteer\lib\Page.js:329
:29)
at Page.<anonymous> (C:\Users\Administrator\node_modules\puppeteer\lib\helpe
r.js:109:23)
at main (C:\Users\Administrator\Desktop\webscrape\text.js:35:43)
at process._tickCallback (internal/process/next_tick.js:68:7)
部分链接无法加载成功。当我手动刷新这些页面时,它起作用了。所以我希望有一个功能或方法可以帮助我在出现错误时自动重新加载我的页面。
您始终可以通过 DOM 重新加载页面,如下所示:
await page.evaluate(() => {
location.reload(true)
})
或者这里是 lot of ways 如何通过 DOM
使用浏览器 JS 重新加载页面
此外,您还可以导航您的木偶操纵者 back and forward。像这样:
await page.goBack();
await page.goForward();
所以在注释之后,下面一行就报错了
ERROR Error: Error: failed to find element matching selector "div.det-name-int"
因为 Puppetteer 有一个浏览器回调。当它找到元素并调用回调时,如果元素不存在则抛出错误。
此外,页面已重新加载。在那之后你什么都不做。如果你想在那之后获取图像。使用
await page.$eval('div.det-name-int', div => div.innerText.trim());
重新加载后。或者你可以有一个 while 循环来不断地检查元素是否存在。如果没有,则刷新页面并再次检查。这可确保您始终拥有内容。
但是如果您的内容是动态生成的,而不是您阅读页面时 DOM 的一部分,那么您的代码将变得毫无用处。您可能需要添加超时,然后在 dom 中搜索该元素。
我设法使用 while 循环解决了它。
for (let appUrl of appUrls) {
var count = i++;
while(true){
try{
await page.goto(appUrl);
const appName = await page.$eval('div.det-name-int', div => div.innerText.trim());
console.log('\n' + count);
console.log('Name: ' , appName);
break;
} catch(e){
console.log('\n' + count);
console.log('ERROR');
await page.reload(appUrl);
continue;
}
}
这对我有用:
await page.reload({ waitUntil: ["networkidle0", "domcontentloaded"] });
有关详细信息,请参阅 Puppeteer 文档:https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagereloadoptions
每当页面加载不正确或遇到问题时,我想重新加载页面。我尝试了 page.reload()
但它不起作用。
for(const sect of sections ){
// Now collect all the URLs
const appUrls = await page.$$eval('div.main > ul.app-list > li > div.app-info a.app-info-icon', links => links.map(link => link.href));
// Visit each URL one by one and collect the data
for (let appUrl of appUrls) {
var count = i++;
try{
await page.goto(appUrl);
const appName = await page.$eval('div.det-name-int', div => div.innerText.trim());
console.log('\n' + count);
console.log(appName);
} catch(e){
console.log('\n' + count);
console.log('ERROR', e);
await page.reload();
}
}
}
它给我这个错误:
ERROR Error: Error: failed to find element matching selector "div.det-name-int"
at ElementHandle.$eval (C:\Users\Administrator\node_modules\puppeteer\lib\JS
Handle.js:418:13)
at process._tickCallback (internal/process/next_tick.js:68:7)
-- ASYNC --
at ElementHandle.<anonymous> (C:\Users\Administrator\node_modules\puppeteer\
lib\helper.js:108:27)
at DOMWorld.$eval (C:\Users\Administrator\node_modules\puppeteer\lib\DOMWorl
d.js:149:21)
at process._tickCallback (internal/process/next_tick.js:68:7)
-- ASYNC --
at Frame.<anonymous> (C:\Users\Administrator\node_modules\puppeteer\lib\help
er.js:108:27)
at Page.$eval (C:\Users\Administrator\node_modules\puppeteer\lib\Page.js:329
:29)
at Page.<anonymous> (C:\Users\Administrator\node_modules\puppeteer\lib\helpe
r.js:109:23)
at main (C:\Users\Administrator\Desktop\webscrape\text.js:35:43)
at process._tickCallback (internal/process/next_tick.js:68:7)
部分链接无法加载成功。当我手动刷新这些页面时,它起作用了。所以我希望有一个功能或方法可以帮助我在出现错误时自动重新加载我的页面。
您始终可以通过 DOM 重新加载页面,如下所示:
await page.evaluate(() => {
location.reload(true)
})
或者这里是 lot of ways 如何通过 DOM
此外,您还可以导航您的木偶操纵者 back and forward。像这样:
await page.goBack();
await page.goForward();
所以在注释之后,下面一行就报错了
ERROR Error: Error: failed to find element matching selector "div.det-name-int"
因为 Puppetteer 有一个浏览器回调。当它找到元素并调用回调时,如果元素不存在则抛出错误。
此外,页面已重新加载。在那之后你什么都不做。如果你想在那之后获取图像。使用
await page.$eval('div.det-name-int', div => div.innerText.trim());
重新加载后。或者你可以有一个 while 循环来不断地检查元素是否存在。如果没有,则刷新页面并再次检查。这可确保您始终拥有内容。
但是如果您的内容是动态生成的,而不是您阅读页面时 DOM 的一部分,那么您的代码将变得毫无用处。您可能需要添加超时,然后在 dom 中搜索该元素。
我设法使用 while 循环解决了它。
for (let appUrl of appUrls) {
var count = i++;
while(true){
try{
await page.goto(appUrl);
const appName = await page.$eval('div.det-name-int', div => div.innerText.trim());
console.log('\n' + count);
console.log('Name: ' , appName);
break;
} catch(e){
console.log('\n' + count);
console.log('ERROR');
await page.reload(appUrl);
continue;
}
}
这对我有用:
await page.reload({ waitUntil: ["networkidle0", "domcontentloaded"] });
有关详细信息,请参阅 Puppeteer 文档:https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagereloadoptions