抓取BSCScan表格数据返回空白 原有Python可用代码突然失效
故障原因
- 反爬拦截:BSCScan现已启用Cloudflare人机校验机制,你使用的2021年的旧版User-Agent极易被识别为爬虫,普通requests请求大概率返回403或验证页面,没有拿到真实的持仓表格数据,因此遍历无内容、输出空白。
- 请求逻辑错误:你创建了
requests.Session()但并未实际使用,Session能自动管理Cookie的特性完全浪费,进一步提升了被反爬拦截的概率。 - 页面结构更新:BSCScan的持仓页DOM结构已迭代,原有硬编码的
findAll('table')[0]索引、合约图标选择器都已失效,就算拿到页面内容也无法正确定位数据。 - 格式化逻辑错误:原有print语句的占位符顺序、位置标记错误,就算拿到数据也会出现格式错乱甚至报错。
修复方案
- 替换普通requests为
cloudscraper库自动绕过Cloudflare验证,不需要手动处理人机校验 - 修正请求逻辑,更新为最新的浏览器User-Agent
- 替换硬编码的表格索引为带class的精准选择器,适配最新的页面结构
- 修正输出格式化的参数顺序,和实际数据对应
修复后可运行代码
import cloudscraper from bs4 import BeautifulSoup # 初始化可绕过Cloudflare的请求实例 scraper = cloudscraper.create_scraper( browser={ 'browser': 'chrome', 'platform': 'windows', 'desktop': True } ) url = "https://bscscan.com/token/generic-tokenholders2?m=normal&a=" token = "0xe56842ed550ff2794f010738554db45e60730371" holdersurl = url + token # 请求页面 r = scraper.get(holdersurl) r.encoding = 'utf-8' soupblockdetails = BeautifulSoup(r.text, 'html.parser') # 精准定位持仓表格,避免硬编码索引失效 holder_table = soupblockdetails.select_one('table.table.table-hover.table-striped.align-middle') rowsblockdetails = holder_table.find_all('tr', limit=6) for row in rowsblockdetails[1:]: tds = row.find_all('td') rank = tds[0].text.strip() address = tds[1].text.strip() amount = tds[2].text.strip() percentage = tds[3].text.strip() value = tds[4].text.strip() try: # 适配最新的合约图标选择器 row.select_one("i.text-secondary[title='Contract']") calock = "Contract" except: calock = "Unlocked" # 修正格式化顺序,和输出需求对齐 print(f"{rank} {address} {amount} {percentage} {value} {calock}")
依赖安装
运行前先安装需要的第三方库:
pip install cloudscraper beautifulsoup4
内容的提问来源于stack exchange,提问作者rbutrnz
相关产品推荐
相关产品推荐

