Selenium爬虫跳转页面后无法保留当前页的原因及解决方法
Selenium爬取返回后回到第一页的原因与解决方法
问题原因分析
你遇到的返回后回到第一页的情况,核心原因有两点:
- 自定义返回按钮的逻辑缺陷:代码中点击的返回按钮(
//a[@id='j_id23:j_id50'])是网站自身的返回控件,并非基于浏览器历史记录跳转,它的默认行为是直接回到搜索结果的第一页,而非之前停留的第二页。 - 分页状态未持久化:进入详情页后,网站的分页状态没有通过URL参数或会话保存,返回时页面默认重置为初始的第一页。
另外,虽然你的代码在处理每行时重新获取了页面元素,规避了stale元素异常,但这并不能解决返回后页面跳转逻辑的问题。
解决方法
方法1:用浏览器历史回退替换自定义返回按钮(优先推荐)
直接调用浏览器的回退功能,基于浏览历史回到之前的分页页面,完全避开网站返回按钮的不合理逻辑。
修改代码中点击返回按钮的片段:
# 移除原有的返回按钮点击代码 # WebDriverWait(driver, 10).until( # EC.element_to_be_clickable((By.XPATH, "//a[@id='j_id23:j_id50']")) # ).click() # 改用浏览器回退 driver.back() # 用显式等待替代固定sleep,提升稳定性 wait.until(EC.presence_of_element_located((By.XPATH, ".//table[@class='iceDatTbl tablaElementos']//tbody"))) # 回退后重新确认iframe(若页面结构重置) iframe_element = wait.until(EC.presence_of_element_located((By.XPATH, '//iframe[contains(@src, "censo.abogacia.es")]'))) driver.switch_to.frame(iframe_element)
方法2:记录当前页码,返回后重新跳转
如果浏览器回退不适用,可以在进入详情页前记录当前页码,返回后重新点击分页按钮回到对应页面:
- 在主循环中添加页码记录:
i=0 while True: current_page_num = i + 1 # 记录当前所在页码 # ... 原有页面元素处理代码 ...
- 处理完详情页后,重新跳转至当前页码:
# 点击网站返回按钮回到第一页 WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//a[@id='j_id23:j_id50']")) ).click() wait.until(EC.presence_of_element_located((By.XPATH, ".//table[@class='iceDatTbl tablaElementos']//tbody"))) # 重新点击分页按钮到当前页码 for _ in range(current_page_num - 1): next_page = driver.find_element(By.XPATH, "//img[@id='j_id23:j_id79']") next_page.click() wait.until(EC.staleness_of(next_page)) # 等待页面切换完成
额外优化建议
- 尽量用
WebDriverWait显式等待替代time.sleep(),减少不必要的等待时间,同时提升爬虫稳定性。 - 每次页面跳转后(包括回退),重新确认iframe的切换状态,避免因页面结构变化导致元素定位失败。
内容的提问来源于stack exchange,提问作者arslan
相关产品推荐
相关产品推荐

