我正试图通过Puppeter加载页面列表,并注入两个从中获取内容的脚本。
完整错误为:
Error: Execution context was destroyed, most likely because of navigation.
我正在将page.addScriptTag()
添加到Promise.all()
。这似乎使刮擦失败。
(async () => {
const browser = await puppeteer.launch({
headless: false,
args: [],
});
const page = await browser.newPage();
page.setRequestInterception(true);
page.setDefaultNavigationTimeout(0);
for (const url of links) {
await retry(
() =>
Promise.all([
page.goto(siteUrl + url),
page.waitForNavigation(),
page.waitForSelector('body'),
page.addScriptTag({ path: 'util.js' }),
page.addScriptTag({
path: 'scrape.js',
content: `const url = ${url}`,
}),
])
.then(() => {
init(page, url, siteUrl);
})
.catch((err) => console.log(err)),
5
);
}
})();
init()
只是用来运行和评估的,这就是我运行注入脚本中的函数的地方。
const init = async (page, url, siteUrl) => {
return await page.evaluate(
async (url, siteUrl) => {
console.log('ev ', url, siteUrl);
//Not doing anything here yet.
},
url,
siteUrl
);
};
我到底做错了什么?
- 我认为不需要对连续任务使用
Promise.all
。尝试仅使用连续的await
s - 您不需要
page.waitForNavigation()
和page.goto()
,这是隐含的,两者都可以挂起流 - 当
page.goto()
等待暗示身体存在的'load'
事件时,page.waitForSelector('body')
也显得过度 - 如果你在每一页中都需要
addScriptTag()
,可以考虑使用page.evaluateOnNewDocument()
,但我在这里不确定 - 我怀疑
page.addScriptTag()
是否可以同时使用path
和content
选项