木偶:向下滚动Twitter时间轴将停止

时间:2019-03-09 03:35:15

标签: javascript node.js twitter web-scraping puppeteer

我在用伪造者在用户时间线上抓取所有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);
})();

1 个答案:

答案 0 :(得分:0)

您可以尝试以下两种方法之一吗?该脚本尝试通过比较滚动高度(如您所做的那样)或等待标记流结束的元素可见来滚动到底部。所有滚动逻辑都放置在浏览器上下文中评估的函数中。这两个函数均会在整页中返回推文计数,以将结果与时间轴顶部声明的用户推文计数进行比较。另外,对于第一种方法,我将延迟时间更改为3秒,因为有时1秒对于更改滚动高度似乎太小了。

git merge origin/develop