我已经在node
中与puppeteer
一起创建了一个脚本,以从网站的目标网页上抓取不同帖子的链接,而我的脚本可以做到这一点。尽管该站点的内容是静态的,但我还是puppeteer的人,因为我对此很陌生,所以查看了它的性能。
我现在要做的是利用这些链接遍历不同的页面,从而重新使用同一浏览器,而不会从新页面上刮取任何内容。但是,我无法修改脚本以反映相同的内容。
这是我到目前为止的尝试:
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({headless:false});
const [page] = await browser.pages();
await page.goto("https://stackoverflow.com/questions/tagged/web-scraping");
page.waitFor(".summary");
const sections = await page.$$(".summary");
let data = [];
for (const section of sections) {
const itemName = await section.$eval(".question-hyperlink", el => el.href);
data.push(itemName);
}
browser.close();
return data;
})();
如何纠正我的脚本,以使其能够使用同一浏览器遍历新收集的链接?
答案 0 :(得分:4)
您可以将现有页面重用于收集的链接,并在关闭浏览器之前对其进行迭代:
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({headless:false});
const [page] = await browser.pages();
await page.goto("https://stackoverflow.com/questions/tagged/web-scraping");
page.waitFor(".summary");
const sections = await page.$$(".summary");
let data = [];
for (const section of sections) {
const itemName = await section.$eval(".question-hyperlink", el => el.href);
data.push(itemName);
}
// iterate over the URLs
for (const url of data) {
await page.goto(url);
}
await browser.close();
return data;
})();
const puppeteer = require("puppeteer");
async function crawlUrls(data, page) {
for (const url of data) {
await page.goto(url);
}
}
(async () => {
// ...
// iterate over the URLs
await crawlUrls(data, page);
// ...
})();