如何使用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
相关产品推荐
相关产品推荐

