为何无法抓取Etherscan数据?Selenium代码问题排查与修复
Etherscan代币持仓页面抓取问题修复
问题诊断
你的代码存在几处明显错误,同时Etherscan的反爬机制也可能影响抓取效果,具体问题点如下:
- iframe ID拼写错误:代码中写的
tokeholdersiframe应为tokenholdersiframe(少了一个字母n) - 多类名选择错误:
By.CLASS_NAME不支持空格分隔的多个类名,需改用CSS选择器 - 元素获取方式错误:
find_element仅返回单个元素,无法遍历,应使用find_elements - 等待机制不够可靠:隐式等待在动态页面中不如显式等待精准
修复后的代码
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 selenium.webdriver.chrome.service import Service # 初始化ChromeDriver(推荐用Service类替代环境变量设置) service = Service(executable_path=r"C:\chromedriver_win32\chromedriver.exe") driver = webdriver.Chrome(service=service) try: driver.get('https://etherscan.io/token/0xb3999f658c0391d94a37f7ff328f3fec942bcadc#balances') # 处理Cookie同意弹窗(如果出现) try: accept_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, 'btnCookie')) ) accept_btn.click() except: pass # 没有弹窗则跳过 # 显式等待iframe加载完成并切换 token_iframe = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.ID, 'tokenholdersiframe')) ) driver.switch_to.frame(token_iframe) # 等待持仓数据表格加载,获取所有目标元素 balance_elements = WebDriverWait(driver, 20).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.align-middle.text-nowrap')) ) # 遍历输出文本(注意:这些元素包含地址、持仓量、占比等,需根据需求筛选) for elem in balance_elements: print(elem.text) finally: driver.quit()
额外注意事项
- 反爬机制:Etherscan会限制频繁请求,建议每次请求后添加
time.sleep(2)之类的间隔,避免IP被封禁 - 数据筛选:上述代码会输出所有匹配类名的元素文本,如果你需要Binance的持仓数据,可以在遍历过程中判断文本是否包含"Binance",再提取对应的持仓量和占比
- API替代方案:Etherscan提供官方API(需申请API密钥),比爬虫更稳定合规,适合批量获取数据
内容的提问来源于stack exchange,提问作者Marcuss
相关产品推荐
相关产品推荐

