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

Selenium解析与滚动异常问题:第二页需实现与第一页一致的渐进式滚动

解决分页后渐进式滚动失效的问题

嘿,我来帮你排查这个问题!你遇到的第二页瞬间滚到底的情况,核心原因是**n变量没有在进入新页面时重置**。第一页循环结束后n已经累积到很大的数值,第二页加载后直接执行window.scrollTo(0, {n}),自然就瞬间跳到了页面底部,完全跳过了渐进式滚动的过程。

第一步:修复核心问题 - 重置滚动偏移量

每次进入新页面时,把n重置为0,这样每一页的滚动都从顶部开始:

driver.get(url=url)
# 先获取总页数
pagination_text = driver.find_element(By.CLASS_NAME, "ipsPagination_pageJump").text
total_pages = int(pagination_text.split()[3])

for page_number in range(1, total_pages + 1):  # 直接从1开始循环,不用再加1
    driver.get(url=url + f"page/{page_number}")
    time.sleep(2)  # 这里后面可以优化成显式等待
    n = 0  # 关键:进入新页面后重置滚动偏移量
    imgs = driver.find_elements(By.CLASS_NAME, "cGalleryPatchwork_image")
    for i in imgs:
        n += 500
        driver.execute_script(f"window.scrollTo(0, {n})")
        time.sleep(0.2)
        print(i.get_attribute("src"))

driver.quit()

第二步:优化代码(可选但推荐)

你的代码确实可以更健壮,比如替换固定time.sleep为显式等待,避免页面加载慢导致的元素找不到问题;另外滚动逻辑可以更灵活,比如基于当前窗口高度滚动,而不是固定500像素:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get(url=url)
pagination_text = driver.find_element(By.CLASS_NAME, "ipsPagination_pageJump").text
total_pages = int(pagination_text.split()[3])

wait = WebDriverWait(driver, 10)  # 定义等待对象,超时10秒

for page_number in range(1, total_pages + 1):
    driver.get(url=url + f"page/{page_number}")
    # 等待图片元素加载完成,再开始滚动
    wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "cGalleryPatchwork_image")))
    
    n = 0
    imgs = driver.find_elements(By.CLASS_NAME, "cGalleryPatchwork_image")
    window_height = driver.execute_script("return window.innerHeight")  # 获取当前窗口高度
    
    for idx, i in enumerate(imgs):
        # 每滚一个图片,滚动窗口高度的比例,或者基于元素位置滚动
        n += window_height * 0.8  # 每次滚动80%窗口高度,更自然
        driver.execute_script(f"window.scrollTo(0, {n})")
        # 等待元素加载完成(避免图片src还没加载出来)
        wait.until(EC.presence_of_element_located((By.CLASS_NAME, "cGalleryPatchwork_image")))
        print(i.get_attribute("src"))

driver.quit()

额外说明

还有一个可能的点:有些网站的分页加载后,页面会自动滚动到某个位置(比如之前的滚动位置),你可以在进入新页面后先强制滚动到顶部:

driver.get(url=url + f"page/{page_number}")
driver.execute_script("window.scrollTo(0, 0)")  # 强制回到顶部

这样应该就能让每一页都像第一页一样实现渐进式滚动啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:22:40