Python通过URL拉取数据遇JSONDecodeError,如何获取地址交易表格数据?
问题原因
你调用response.json()报错是因为请求的Etherscan地址页面返回的是HTML网页内容,不是JSON格式数据,自然无法解析成JSON。
解决方法
下面提供两种可行方案,优先推荐第二种(API方式更稳定):
方案一:网页解析提取表格(用BeautifulSoup + Pandas)
直接解析页面中的代币交易表格,转为DataFrame:
import requests from bs4 import BeautifulSoup import pandas as pd wallet_addresses = ['0x7abe0ce388281d2acf297cb089caef3819b13448', '0xC098B2a3Aa256D2140208C3de6543aAEf5cd3A94', '0x2FAF487A4414Fe77e2327F0bf4AE2a264a776AD2'] headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36' } for address in wallet_addresses: url = f'https://etherscan.io/address/{address}#tokentxns' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 定位代币交易表格(页面中id为'tokentxns'的表格) token_table = soup.find('table', id='tokentxns') # 用Pandas直接读取表格转为DataFrame df = pd.read_html(str(token_table))[0] print(f"地址 {address} 的交易记录:") print(df) # 可将DataFrame转为JSON:df.to_json(orient='records')
注意:这种方法依赖Etherscan页面的HTML结构,若页面更新可能会失效。
方案二:使用Etherscan官方API(推荐)
通过官方API直接获取结构化的JSON数据,更稳定可靠:
- 先去Etherscan官网免费申请一个API密钥
- 调用代币交易查询接口,代码示例:
import requests import pandas as pd API_KEY = '你的API密钥' # 替换成你自己的密钥 wallet_addresses = ['0x7abe0ce388281d2acf297cb089caef3819b13448', '0xC098B2a3Aa256D2140208C3de6543aAEf5cd3A94', '0x2FAF487A4414Fe77e2327F0bf4AE2a264a776AD2'] for address in wallet_addresses: # 构造API请求URL,查询代币交易记录 url = f'https://api.etherscan.io/api?module=account&action=tokentx&address={address}&startblock=0&endblock=99999999&sort=desc&apikey={API_KEY}' response = requests.get(url) data = response.json() # 提取交易数据转为DataFrame if data['status'] == '1': df = pd.DataFrame(data['result']) print(f"地址 {address} 的交易记录:") print(df) # 可将DataFrame转为JSON:df.to_json(orient='records') else: print(f"地址 {address} 查询失败:{data['message']}")
优势:API返回标准JSON,结构稳定,还支持分页、排序等更多参数,避免网页解析的不确定性。
内容的提问来源于stack exchange,提问作者MathMan 99
相关产品推荐
相关产品推荐

