我正在尝试在 nodejs 应用程序中使用 playwright 从多个 URL 获取页面内容。我的代码如下所示:
const getContent = async (url: string): Promise<string> {
const browser = await firefox.launch({ headless: true });
const page = await browser.newPage();
try {
await page.goto(url, {
waitUntil: 'domcontentloaded',
});
return await page.content();
} finally {
await page.close();
await browser.close();
}
}
const items = [
{
urls: ["https://www.google.com", "https://www.example.com"]
// other props
},
{
urls: ["https://www.google.com", "https://www.example.com"]
// other props
},
// more items...
]
await Promise.all(
items.map(async (item) => {
const contents = [];
for (url in item.urls) {
contents.push(await getContent(url))
}
return contents;
}
)
我收到类似的错误,error (Page.content): Target closed.
但我注意到如果我只是在没有循环的情况下运行:
const content = getContent('https://www.example.com');
有用。
看起来循环的每次迭代都共享相同的浏览器和/或页面实例,因此它们彼此关闭/导航。
为了测试它,我使用该函数构建了一个 Web API,getContent
当我(几乎)同时发送 2 个请求时,其中一个失败,而不是在发送一个请求时它总是有效。
有没有办法让剧作家并行工作?