无法让p操纵者使用同一浏览器浏览新收集的链接

时间:2019-04-04 15:28:58

标签: node.js web-scraping puppeteer

我已经在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;
})();

如何纠正我的脚本,以使其能够使用同一浏览器遍历新收集的链接?

1 个答案:

答案 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);

    // ...
})();