我在用伪造者在用户时间线上抓取所有tweet URL时遇到麻烦。
使用puppeteer,该脚本应该在scrollToEnd
函数中while循环的每次迭代中向下滚动时间轴,直到到达底部。为了监视进度,我使脚本输出了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);
})();
答案 0 :(得分:0)
您可以尝试以下两种方法之一吗?该脚本尝试通过比较滚动高度(如您所做的那样)或等待标记流结束的元素可见来滚动到底部。所有滚动逻辑都放置在浏览器上下文中评估的函数中。这两个函数均会在整页中返回推文计数,以将结果与时间轴顶部声明的用户推文计数进行比较。另外,对于第一种方法,我将延迟时间更改为3秒,因为有时1秒对于更改滚动高度似乎太小了。
git merge origin/develop