У меня проблемы с копированием всех URL-адресов твитов на временной шкале пользователя с кукловодом.
С кукольником сценарий должен прокручивать временную шкалу на каждой итерации цикла while в функции scrollToEnd
, пока не достигнет дна.Чтобы следить за прогрессом, я заставил скрипт вывести значение переменной previousHeight
, которая является текущим значением scrollheight
из document.body
, вычисляемым каждый раз перед выполнением прокрутки.
Однако прокрутка прекращается, когда выходное значение становится 285 834.Что удивительно, так это то, что скрипт не выходит из цикла while и метод page.waitForFunction
не вызывает ошибку времени ожидания.
Как мне переписать функцию scrollToEnd
или любую другую часть скрипта, чтобы функция правильно заканчивалась?
Вот фрагмент моего кода.Нерелевантные функции опущены для краткости.
const puppeteer = require('puppeteer');
var UserUrls = ['https://twitter.com/someuser'];
// more functions here
async function scrollToEnd(
page,
ScrollDelay = 1000
) {
try {
let previousHeight = 0;
let notEnd = await page.waitForFunction(`document.body.scrollHeight > ${previousHeight}`);
while (notEnd) {
previousHeight = await page.evaluate('document.body.scrollHeight');
await page.evaluate('window.scrollBy(0, document.body.scrollHeight)');
await page.waitFor(ScrollDelay);
notEnd = await page.waitForFunction(`document.body.scrollHeight > ${previousHeight}`);
console.log(previousHeight)
};
return;
} catch (e) {
return;
};
};
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
var tweetUrls = [];
for (let UserUrl of UserUrls) {
await page.goto(UserUrl);
await page.evaluate((async () => {
await scrollToEnd(page);
})());
await page.screenshot({ path: 'PageEnd.png' });
tweetUrls = await getTweetUrls(page, extractItems, 100);
};
await browser.close();
console.log(tweetUrls);
})();