const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
var urls = ['https://www.google.com','https://www.firefox.com'];
await Promise.all(urls.map(async (url) => {
await page.goto(url, { timeout: 0, waitUntil: "networkidle2" });
console.log(page.url());
}))
await browser.close();
});
此代码返回数组最后一个URL的2倍,为什么?
https://www.mozilla.org/en-US/firefox/new/?utm_medium=referral&utm_source=firefox-com https://www.mozilla.org/en-US/firefox/new/?utm_medium=referral&utm_source=firefox-com
答案 0 :(得分:1)
您传递给map
的函数在每个URL上并行运行 。
您只能远程控制一个浏览器。
因此,您将其告诉goto
一页,然后await
进行响应,以便选择下一个函数。它告诉浏览器转到不同页面,该页面取消了尝试转到第一页的尝试。当到达该页面时,两个诺言都会得到“我已经到达!”。消息并选择读取数据。
您需要遍历URL,并以顺序而不是并行运行它们。
答案 1 :(得分:0)
@Quentin的答案说明为什么发生这种情况,此外,我想添加一个代码示例,说明如何依次进行。在以下示例中,浏览器将一个接一个地访问这些页面:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
let urls = ['https://www.google.com', 'https://www.firefox.com'];
for (let i = 0; i < urls.length; i++) {
await page.goto(urls[i], {timeout: 0, waitUntil: "networkidle2"});
console.log(page.url());
}
await browser.close();
});
如果您要同时访问这些页面,则可以在浏览器中打开两个页面并执行类似的操作,这将比上一个示例更快:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
let urls = ['https://www.google.com', 'https://www.firefox.com'];
await Promise.all(urls.map((url) => {
return new Promise(async (resolve, reject) => {
// Open new page for each url
let page = await browser.newPage();
await page.goto(url, {timeout: 0, waitUntil: "networkidle2"});
console.log(page.url());
resolve();
});
}));
await browser.close();
});