Невозможно позволить кукловоду просматривать вновь собранные ссылки, используя тот же браузер - PullRequest
1 голос
/ 04 апреля 2019

Я создал скрипт в 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 Ответ

4 голосов
/ 04 апреля 2019

Вы можете повторно использовать существующую страницу для собранных ссылок и перебирать их перед закрытием браузера:

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

    // ...
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...