剧作家自动滚动到无限滚动页面的底部
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)
我正在尝试使用 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)