【问题标题】:Playwright auto-scroll to bottom of infinite-scroll page编剧自动滚动到无限滚动页面底部
【发布时间】:2021-11-10 00:00:10
【问题描述】:

我正在尝试使用 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 循环告诉它永远继续下去。

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

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

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 浏览器中都不起作用。它立即返回,不会间隔执行代码。

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

【问题讨论】:

    标签: javascript python python-3.x playwright


    【解决方案1】:

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

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

    我使用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多