如何用Python+Playwright实现无限滚动页面自动滚动至底部并停止
Playwright 无限滚动自动停止实现方案
问题原因
你之前编写的JS代码无法生效的核心原因是page.evaluate()仅等待同步代码执行完成就会立即返回,不会等待内部setInterval这类异步逻辑的执行结果,所以代码看起来像没有运行就直接结束了。
完整实现方案
核心逻辑为每次滚动后对比页面/滚动容器的高度,连续多次高度无变化时判定所有内容加载完成,自动停止滚动。
整页滚动实现
适用于整个页面为无限滚动的场景:
def auto_scroll_to_end(page, wait_time=1000, max_stable_count=3): # 记录初始页面高度 last_height = page.evaluate("document.body.scrollHeight") stable_count = 0 while True: # 滚动到页面底部 page.evaluate("window.scrollTo(0, document.body.scrollHeight)") # 等待新内容加载 page.wait_for_timeout(wait_time) # 获取加载完成后的新高度 new_height = page.evaluate("document.body.scrollHeight") # 高度无变化则计数 if new_height == last_height: stable_count += 1 # 连续多次高度无变化,判定内容全部加载完成 if stable_count >= max_stable_count: break else: # 高度有变化重置计数,更新高度基准值 stable_count = 0 last_height = new_height
指定容器滚动实现
适用于评论区、侧边栏等局部容器内部无限滚动的场景:
def auto_scroll_container_to_end(page, container_selector, wait_time=1000, max_stable_count=3): # 记录容器初始高度 last_height = page.evaluate(f'document.querySelector("{container_selector}").scrollHeight') stable_count = 0 while True: # 滚动容器到底部 page.evaluate(f''' const container = document.querySelector("{container_selector}"); container.scrollTop = container.scrollHeight; ''') # 等待新内容加载 page.wait_for_timeout(wait_time) # 获取容器新高度 new_height = page.evaluate(f'document.querySelector("{container_selector}").scrollHeight') if new_height == last_height: stable_count += 1 if stable_count >= max_stable_count: break else: stable_count = 0 last_height = new_height # 调用示例,传入评论容器的选择器 auto_scroll_container_to_end(page, ".comment-container")
配置说明
wait_time:每次滚动后等待内容加载的时长,单位为毫秒,站点加载速度慢可以适当调大,建议取值1500或2000max_stable_count:连续多少次高度无变化判定为加载完成,默认3次可以避免网络波动、加载延迟导致的提前停止- 部分站点滚动后会出现加载动画,可以在等待逻辑前加入等待加载动画消失的逻辑,避免误判:
# 示例:等待加载动画消失 page.wait_for_selector(".loading-spinner", state="hidden", timeout=wait_time)
内容的提问来源于stack exchange,提问作者alex_bits
相关产品推荐
相关产品推荐

