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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:54:04