使用parsel选择器爬取BSC动态交易表获取首笔交易发件地址求助
问题修复方案
核心问题定位
- 缺失
requests库导入,代码运行就会触发基础报错 - URL中携带的
sid是BSCscan生成的临时会话参数,有效期极短,过期后请求返回的页面结构、数据全部异常,是返回空列表的核心原因 - 总页数、地址提取的选择器规则过于依赖页面元素位置,容错率极低,BSCscan前端结构稍有调整就会提取失败
- 遍历表格行时未过滤表头行,会触发空匹配报错
修正后可运行代码
import requests from parsel import Selector contract_address = "0x431e17fb6c8231340ce4c91d623e5f6d38282936" headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"} # 移除临时失效的sid参数,使用BSCscan通用交易列表接口 pg_num_url = f"https://bscscan.com/token/generic-tokentxns2?contractAddress={contract_address}&m=normal&p=1" response = requests.get(pg_num_url, headers=headers) sel = Selector(response.text) # 基于文本特征提取总页数,不依赖元素固定位置 page_info = sel.xpath('//span[contains(text(), "of")]/strong[2]/text()').get() pg_num = int(page_info.strip()) if page_info else 1 # 跳转至最后一页即最早交易记录页 last_page_url = f"https://bscscan.com/token/generic-tokentxns2?contractAddress={contract_address}&m=normal&p={pg_num}" response = requests.get(last_page_url, headers=headers) sel = Selector(response.text) addresses = [] # 仅匹配带td的交易数据行,过滤表头行 for row in sel.xpath('//table//tr[td]'): # 直接匹配From列地址的标准哈希格式,容错率更高 from_addr = row.xpath('./td[5]/a/@href').re_first(r'/address/(0x[a-fA-F0-9]{40})') if from_addr: addresses.append(from_addr) # 最后一页的最后一条记录就是首笔交易的From地址 print(addresses[-1])
优化说明
- 移除了临时失效的
sid参数,调用BSCscan公开通用接口,无需担心会话过期问题 - 总页数提取改为基于文本特征匹配,不受前端元素位置调整影响
- 地址提取直接匹配标准40位哈希格式,省去复杂正则切片逻辑,容错率大幅提升
- 新增表头行过滤逻辑,避免空匹配触发报错
内容的提问来源于stack exchange,提问作者BJonas88
相关产品推荐
相关产品推荐

