Selenium无法更新页面问题(Python):同URL翻页爬取失效
解决Selenium点击Next按钮后页面不更新的问题
我来帮你排查下这个问题,你遇到的情况大概率是这几个原因导致的,咱们逐个解决:
1. 固定sleep不可靠,改用显式等待
time.sleep(10)是固定时长等待,但实际页面加载速度受网络波动影响,要么浪费时间,要么还没加载完成就继续执行了。建议用Selenium的显式等待,等关键元素加载完成后再操作,稳定性会高很多。
2. 点击Next后iframe会重新加载,需重新切换
当你点击Next按钮后,包含代币持有者表格的iframe会重新刷新,之前的iframe引用会失效。必须先切回主文档,再重新定位并切换到新的iframe,才能获取到下一页的内容。
3. 按钮定位可能存在歧义
find_element_by_link_text('Next')偶尔会因为页面上有多个相同文本的按钮而出错,改用更精准的定位方式(比如XPath或CSS选择器)能避免这个问题。
修改后的代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup import time driver = webdriver.Chrome() driver.get("https://etherscan.io/token/0x168296bb09e24a88805cb9c33356536b980d3fc5#balances") wait = WebDriverWait(driver, 15) # 第一次切换到iframe,等待iframe加载完成 iframe1 = wait.until(EC.presence_of_element_located((By.ID, 'tokeholdersiframe'))) driver.switch_to.frame(iframe1) # 处理第一页数据 soup = BeautifulSoup(driver.page_source, 'html.parser') token_holders = soup.find_all('tr') # 这里可以添加数据存储/处理逻辑 # 精准定位并点击Next按钮 next_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Next') and contains(@class, 'page-link')]"))) next_btn.click() # 等待iframe刷新后,重新切换 time.sleep(2) # 短暂等待iframe开始刷新 driver.switch_to.default_content() # 先切回主页面 iframe2 = wait.until(EC.presence_of_element_located((By.ID, 'tokeholdersiframe'))) driver.switch_to.frame(iframe2) # 处理第二页数据 soup_next = BeautifulSoup(driver.page_source, 'html.parser') token_holders_next = soup_next.find_all('tr') # 添加第二页数据的处理逻辑 # 如果要爬多页,可以循环执行上述点击+重新切换+数据处理的步骤,直到Next按钮不可点击
额外注意事项
- 循环爬取时,每次点击Next后都要重复「切回主文档→重新定位iframe并切换」的步骤
- Etherscan有反爬机制,不要频繁请求,适当增加等待间隔,模拟人类操作节奏
- 爬取到最后一页时,Next按钮会变成不可点击状态,可以用
EC.invisibility_of_element_located判断循环终止条件
内容的提问来源于stack exchange,提问作者user9701233
相关产品推荐
相关产品推荐

