无法让木偶操作者浏览重新使用相同浏览器的新收集的链接

问题描述 投票:1回答:1

我在node中创建了一个与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;
})();

我如何纠正我的脚本,以便它重用相同的浏览器来遍历新收集的链接?

node.js web-scraping puppeteer
1个回答
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;
})();

Alternative with a separate function

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

    // ...
})();
© www.soinside.com 2019 - 2024. All rights reserved.