Кукловод параллельно соскребает через несколько страниц - PullRequest
0 голосов
/ 19 марта 2020

Я хотел очистить несколько URL-адресов одновременно, поэтому я использовал p-queue для реализации Promise -queue.

Например, см. Код ниже, использует 1 браузер и несколько страниц для выполнения этой работы ,

const queue = new PQueue({
    concurrency: 5
});

(
    async () => {
        let instance = await pptr.launch({
            headless: false,
        });

        // task processor function
        const createInstance = async (url) => {
            let page = await instance.newPage();
            await page.goto(email);

            // (PROBLEM) more operations go here
            ...

            return await page.close();
        }

        // add tasks to queue
        for (let url of urls) {
            queue.add(async () => createInstance(url))
        } 
    }
)()

Проблема в том, что действительно несколько URL-адресов могут быть открыты одновременно на нескольких страницах, но похоже, что только одна (и только одна) страница, на которой работает браузер, продолжит выполнять операции ( см. приведенный выше код more operations go here раздел), другие страницы (или вкладки) просто перестанут работать, если я не нажму на эту страницу, чтобы сфокусироваться на ней.

Так есть ли обходной путь для одновременного запуска всех страниц?

1 Ответ

1 голос
/ 24 марта 2020

Я обнаружил, почему вышеприведенный код не работает, я не должен await instance вне рабочей функции, но внутри await, см. Ниже,

(
    async () => {
        let instance = pptr.launch({  // don't await here
            headless: false,
        });

        // task processor function
        const createInstance = async (url) => {
            let real_instance = await instance;  // await here
            let page = await real_instance.newPage();
            await page.goto(email);

            // (PROBLEM) more operations go here
            ...

            return await page.close();
        }

        // add tasks to queue
        for (let url of urls) {
            queue.add(async () => createInstance(url))
        } 
    }
)()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...