如何不用Webdriver通过Python爬取带SID参数的Etherscan交易页面?
解决Etherscan交易列表分页SID问题(无需Selenium)
方法1:从初始页面源码提取全局SID
既然window.sid是全局变量,它必然会在页面的JS代码中被定义。你可以先请求目标交易列表的初始页面,用正则匹配直接提取这个值,完全不需要执行JS:
import requests import re # 替换成你要爬取的地址交易页URL base_url = "https://etherscan.io/txs?a=0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" } # 获取初始页面源码 response = requests.get(base_url, headers=headers) response.raise_for_status() # 匹配window.sid的赋值语句 sid_pattern = re.compile(r'window\.sid\s*=\s*"([^"]+)"') match_result = sid_pattern.search(response.text) if match_result: sid = match_result.group(1) print(f"提取到SID: {sid}") # 用SID请求分页,比如第3页 page_url = f"{base_url}&p=3&sid={sid}" page_response = requests.get(page_url, headers=headers) # 这里可以处理分页返回的HTML内容 else: print("页面源码中未找到SID变量")
方法2:复用提取到的SID(基于你的观察)
你提到更换IP、隐身模式后SID仍有效,说明它并非用户专属会话ID,大概率是和服务器时间窗口绑定的固定值。可以提取一次SID后重复使用,直到请求返回错误(比如SID过期),再重新提取新的SID即可。
注意事项
- 必须携带真实的
User-Agent,否则Etherscan可能会拦截请求,不返回包含SID的源码 - 控制请求频率,避免触发反爬机制导致IP被封
- 若初始页面源码中未找到SID,可能是页面采用了动态渲染,可以尝试添加
Accept-Language等请求头,或者更换代理IP重试
内容的提问来源于stack exchange,提问作者Zack Adam
相关产品推荐
相关产品推荐

