You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python scrapy-playwright滚动到无限加载页面的底部

Scrapy+Playwright无需依赖底部选择器的无限滚动实现方案

实现思路

核心逻辑通过对比滚动前后的页面高度判断是否还有新内容加载:每次滚动到页面底部后预留加载时间,若加载完成后页面高度无变化,即说明已到达真实底部,全程不需要依赖任何底部元素选择器。

代码修改示例

你原有的预定义playwright_page_coroutines的方式无法支持循环判断逻辑,需要将滚动逻辑移到parse方法中,拿到页面对象后动态执行:

import scrapy
from scrapy_playwright.page import PageCoroutine


class MySpider(scrapy.Spider):
    name = 'my_spider'
    # 可根据需求调整最大滚动次数,防止无限加载站点导致死循环
    MAX_SCROLL_TIMES = 20

    def start_requests(self):
        yield scrapy.Request(
            'my-url',
            meta={
                'playwright': True,
                'playwright_include_page': True,
                # 不需要预定义滚动协程,移到parse里处理
            }
        )

    async def parse(self, response):
        page = response.meta["playwright_page"]
        scroll_count = 0
        # 获取初始页面高度
        last_height = await page.evaluate("document.body.scrollHeight")
        
        while True:
            # 滚动到页面底部
            await page.evaluate("window.scrollBy(0, document.body.scrollHeight)")
            # 等待内容加载,单位毫秒,可根据站点加载速度调整
            await page.wait_for_timeout(2000)
            # 可选优化:等待网络空闲,适配动态加载站点
            # await page.wait_for_load_state("networkidle")
            
            # 获取滚动后的新高度
            new_height = await page.evaluate("document.body.scrollHeight")
            scroll_count += 1
            
            # 高度无变化或超过最大滚动次数,终止滚动
            if new_height == last_height or scroll_count >= self.MAX_SCROLL_TIMES:
                break
            last_height = new_height
        
        # 滚动完成后再解析页面内容
        page_content = await page.content()
        # 你的解析逻辑
        # ...
        
        # 用完记得关闭页面
        await page.close()

注意事项

  • 如果目标站点的滚动区域不是整个页面,而是指定的嵌套容器,只需要把高度获取和滚动逻辑修改为对应容器即可:
    # 示例:滚动class为scroll-box的容器
    await page.evaluate("document.querySelector('.scroll-box').scrollTop = document.querySelector('.scroll-box').scrollHeight")
    new_height = await page.evaluate("document.querySelector('.scroll-box').scrollHeight")
    
  • 部分站点存在滚动到底部后触发加载有延迟的情况,可以适当延长wait_for_timeout的时长,或添加多次判断逻辑,避免提前终止滚动。

内容的提问来源于stack exchange,提问作者Luke Garbutt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:54:01