剧作家自动滚动到无限滚动页面的底部

Playwright auto-scroll to bottom of infinite-scroll page

我正在尝试使用 Python 和 Playwright 自动抓取具有“无限滚动”的网站。

问题是 Playwright 还没有包含滚动功能,更不用说无限自动滚动功能了。

根据我在网上找到的内容和我的个人测试,我可以使用 page.evaluate() 函数和一些 Javascript 代码自动执行无限或有限滚动。

例如,这个有效:

for i in range(20):
    page.evaluate('var div = document.getElementsByClassName("comment-container")[0];div.scrollTop = div.scrollHeight')
    page.wait_for_timeout(500)

这种方法的问题在于,它要么通过指定滚动次数来工作,要么通过 while True 循环告诉它永远持续下去。

我需要找到一种方法让它继续滚动直到最终内容加载完毕。

这是我目前正在尝试的 Javascript page.evaluate():

var intervalID = setInterval(function() {
    var scrollingElement = (document.scrollingElement || document.body);
    scrollingElement.scrollTop = scrollingElement.scrollHeight;
    console.log('fail')
}, 1000);
var anotherID = setInterval(function() {
    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
        clearInterval(intervalID);
    }}, 1000)

这在我的 firefox 浏览器或 Playwright firefox 浏览器中都不起作用。它 returns 立即并且不间断地执行代码。

如果有人能告诉我如何使用 Playwright 创建一个自动滚动功能,当它到达动态加载网页的底部时检测并停止,我将不胜感激。

所以我找到了可行的解决方案。

我所做的是将 Javascript 与 python 编剧代码结合起来。

我用一个 200 毫秒的计时器启动 setInterval,以便在 page.evaluate() 页面上向下滚动,然后我用一个 python 循环跟进它,它每秒检查一次的总高度是否页面(包括卷轴)已更改。如果它发生变化,它会继续滚动,如果它没有发生变化,那么滚动就结束了。
这是它的样子:

page.evaluate(
    """
    var intervalID = setInterval(function () {
        var scrollingElement = (document.scrollingElement || document.body);
        scrollingElement.scrollTop = scrollingElement.scrollHeight;
    }, 200);

    """
)
prev_height = None
while True:
    curr_height = page.evaluate('(window.innerHeight + window.scrollY)')
    if not prev_height:
        prev_height = curr_height
        time.sleep(1)
    elif prev_height == curr_height:
        page.evaluate('clearInterval(intervalID)')
        break
    else:
        prev_height = curr_height
        time.sleep(1)