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

