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

为何无法抓取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()

额外注意事项

  1. 反爬机制:Etherscan会限制频繁请求,建议每次请求后添加time.sleep(2)之类的间隔,避免IP被封禁
  2. 数据筛选:上述代码会输出所有匹配类名的元素文本,如果你需要Binance的持仓数据,可以在遍历过程中判断文本是否包含"Binance",再提取对应的持仓量和占比
  3. API替代方案:Etherscan提供官方API(需申请API密钥),比爬虫更稳定合规,适合批量获取数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:36:04