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
相关产品推荐
相关产品推荐

