Очистка веб-страницы с бесконечной прокруткой для изображений с помощью Puppeteer, но ничего не возвращается в течение асинхронного ожидания - PullRequest
0 голосов
/ 13 февраля 2019

Так что я использую node.js и Puppeteer, чтобы попытаться очистить определенное количество URL-адресов изображений с бесконечно прокручиваемой веб-страницы (я просто использую домашнюю страницу reddit для тестирования, но заменяю вашу собственную, если хотите), но массив, который должен содержать их, возвращается пустым.

Я даже поместил все это в анонимную асинхронную функцию, чтобы я мог принудительно установить ее на await, на случай, если проблема с синхронизацией:

const puppeteer = require('puppeteer');

var pBrowser = await puppeteer.launch();
console.log("\t* Browser launched");
var pPage       = await pBrowser.newPage();
console.log("\t* Page launched");

let sUrl = foo;
await pPage.goto(sUrl);

let iItemCount = 10;
let tImageSrcs = [];
await async function () {
    let iPreviousHeight;
    console.log("Starting search at the top");
    while (tImageSrcs.length < iItemCount) {
        tImageSrcs = await pPage.evaluate( function() {
            let tItems = Array.from(document.images, e => e.src );
            console.log("\t\t* "+tItems.length+" images overall found within this section; trimming...");
            tItems = tItems.filter( sImage => [".jpg",".png"].includes(sImage.substring(sImage.length-4)) );
            console.log("\t\t* "+tItems.length+" images after filtering");
            return tImageSrcs.concat(tItems);
        });
        console.log("\t* "+tImageSrcs.length+" appropriate images sourced so far...");
        iPreviousHeight = await pPage.evalutate("document.body.scrollHeight");
        await pPage.evaluate('window.scrollTo(0, document.body.scrollHeight)');
        console.log("Searching at scroll height "+iPreviousHeight);
        await pPage.waitForFunction(`document.body.scrollHeight > ${iPreviousHeight}`);
        await page.waitFor(1000);
    }
};
console.log("\t* "+tImageSrcs.length+" images sourced");

Но похоже, что он даже не вызывает что-либо в асинхронной функции, потому что независимо от того, удалось ли найти какие-либо изображения или нет, вывод даже не содержит каких-либо из console.log операторов, включая один в (почти) самом верху асинхронной функции:

        * Browser launched
        * Page launched
        * 0 images sourced

1 Ответ

0 голосов
/ 13 февраля 2019

Некоторые примечания:

  1. Вы создаете асинхронную функцию, но не вызываете ее, поэтому она не выполняется:
await async function () { /*...*/ }

должно быть:

await async function () { /*...*/ }()

В любом случае, эта функция оболочки избыточна: я полагаю, что вы уже находитесь внутри асинхронной функции при использовании await, поэтому нет необходимости использовать оболочку.

Вы вызываете console.log("\t* "+tImageSrcs.length+" images sourced");, когда tImageSrcs по-прежнему пусто, так как указанная выше функция не выполняется (await просто ждет ее создания, а не выполнения).

tImageSrcs внутриpPage.evaluate() код не определен (tImageSrcs - переменная в контексте Node.js, она не доступна в контексте браузера).Вам нужно перенести его по его сериализуемому значению.

Так что попробуйте этот вариант:

const puppeteer = require('puppeteer');

var pBrowser = await puppeteer.launch();
console.log("\t* Browser launched");
var pPage       = await pBrowser.newPage();
console.log("\t* Page launched");

let sUrl = foo;
await pPage.goto(sUrl);

let iItemCount = 10;
let tImageSrcs = [];

let iPreviousHeight;
console.log("Starting search at the top");

while (tImageSrcs.length < iItemCount) {
    tImageSrcs = await pPage.evaluate( function(srcs) {
        let tItems = Array.from(document.images, e => e.src );
        console.log("\t\t* "+tItems.length+" images overall found within this section; trimming...");
        tItems = tItems.filter( sImage => [".jpg",".png"].includes(sImage.substring(sImage.length-4)) );
        console.log("\t\t* "+tItems.length+" images after filtering");
        return srcs.concat(tItems);
    }, tImageSrcs);
    console.log("\t* "+tImageSrcs.length+" appropriate images sourced so far...");
    iPreviousHeight = await pPage.evalutate("document.body.scrollHeight");
    await pPage.evaluate('window.scrollTo(0, document.body.scrollHeight)');
    console.log("Searching at scroll height "+iPreviousHeight);
    await pPage.waitForFunction(`document.body.scrollHeight > ${iPreviousHeight}`);
    await page.waitFor(1000);
}

console.log("\t* "+tImageSrcs.length+" images sourced");
...