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

Selenium漫画爬取PDF脚本:翻页后跳过滚动环节求助

问题描述

需要实现以下功能:跳转到select_page参数指定的页面,滚动至页面底部并确认已到达底部,加载页面图片后进入下一页;若当前页与end_page参数匹配则结束流程,循环执行上述操作。目前脚本在第一页运行正常,但进入第二页后会跳过页面滚动环节,直接开始下载图片或点击下一页按钮。

问题排查与解决方案

1. 滚动状态未重置导致跳过滚动

原代码中current_scroll_position在主循环内初始化,但第一页滚动后该变量保留了上一页的滚动位置值,进入第二页时,current_scroll_position已经大于等于新页面的初始高度,直接跳过滚动循环。

修复方式:将current_scroll_position = 0移动到内部滚动循环的最开始,确保每次处理新页面时都从顶部开始滚动:

# 修正后的滚动逻辑
step = 1000
while True:
    current_scroll_position = 0  # 每次新页面都重置滚动位置
    page_height = driver.execute_script("return document.body.scrollHeight;")
    # 滚动页面
    for i in range(current_scroll_position, page_height, step):
        driver.execute_script(f"window.scrollTo(0, {i});")
        sleep(0.1)
        current_scroll_position = i
    # 检查页面高度是否不再变化(确认到达底部)
    new_page_height = driver.execute_script("return document.body.scrollHeight;")
    if new_page_height == page_height:
        break
    else:
        # 高度变化,继续滚动加载
        page_height = new_page_height

2. 页面切换后未等待加载完成

点击下一页后仅使用sleep(5),无法确保新页面完全加载,可能导致滚动时获取的页面高度不准确,或元素未就绪。

修复方式:点击下一页后,等待分页控件或图片容器重新加载完成,确保页面切换成功:

# 点击下一页按钮后添加等待
button.click()
# 等待新页面的分页控件加载完成
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//div[@class='flex items-center justify-center md:gap-x-2']"))
)
# 同时等待图片容器加载,确保页面内容就绪
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//div[@class='md:container']"))
)

3. 滚动逻辑优化(可选)

原滚动逻辑的循环判断不够严谨,可封装成独立函数,改为连续滚动到底部并等待,直到页面高度不再变化,确保所有图片都加载完成:

# 封装滚动至底部的函数
def scroll_to_bottom(driver):
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        # 直接滚动到底部
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        sleep(1)  # 等待内容加载
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height

在主循环中调用此函数替代原滚动代码即可。

修改后的主循环关键片段
# 主循环部分修改
while True:
    # 滚动至页面底部
    scroll_to_bottom(driver)
    
    sleep(2)  # 等待图片加载完成
    
    # 后续图片处理逻辑...
    
    # 检查是否到达结束页
    list = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "//div[@class='flex items-center justify-center md:gap-x-2']"))
    )
    page = list.find_element(By.XPATH, "./button")
    page = page.text
    page = page[page.index("-"):]
    page = int(''.join(filter(str.isdigit, page)))
    print(page)
    if page == int(end_page):
        print("Session ended page")
        break
    
    # 点击下一页并等待页面加载
    button = list.find_element(By.XPATH, "./a[2]")
    button.click()
    # 等待新页面加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "//div[@class='md:container']"))
    )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:43:12