Python爬虫如何在网页中基于十六进制字符串模式抓取补充数据
解决方案
问题原因
你当前使用requests发起的是静态HTTP请求,只能获取页面初始加载的静态HTML内容。目标页面的「读取合约」模块是后续通过JavaScript异步渲染加载的,静态返回的源码里不包含这部分键值对数据,所以你之前的方法无法匹配到对应的十六进制地址字段。
可运行实现代码
我们使用支持JavaScript渲染的requests-html库来获取动态内容,代码如下:
首先安装依赖:
pip install requests requests-html beautifulsoup4
完整代码:
import re from requests_html import HTMLSession from bs4 import BeautifulSoup header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0' } url = "https://bscscan.com/address/0xe1fd7b4c9debac3c490d8a553c455da4979482e4#readContract" session = HTMLSession() req = session.get(url, headers=header, timeout=10) # 渲染JS动态内容,等待2秒确保加载完成 req.html.render(wait=2, sleep=2) soup = BeautifulSoup(req.html.html, 'html.parser') # 原有基础信息提取 creator = soup.find(id='ContentPlaceHolder1_trContract') tokentracker = soup.find(id='ContentPlaceHolder1_tr_tokeninfo') print("Contract Owner:", creator.find('a', attrs={"title": "Creator Address"}).text) print("Transaction ID:", creator.find('a', attrs={"title": "Creator Txn Hash"}).text) print("Token Name:", tokentracker.find("a").text) print() # 提取读取合约模块的地址字段 read_contract_section = soup.find(id="readContractAccordion") if read_contract_section: # 匹配所有符合规则的十六进制地址(40位字符+0x前缀) address_pattern = r'0x[a-fA-F0-9]{40}' # 遍历每个合约读取项 for item in read_contract_section.find_all(class_="card"): try: # 提取序号和字段名 item_title = item.find(class_="mb-0").text.strip() # 提取内容里的地址 item_content = item.find(class_="card-body").text.strip() addresses = re.findall(address_pattern, item_content) if addresses: # 格式化输出,和期望格式对齐 print(f"{item_title.ljust(30)}{addresses[0]}") except Exception: # 跳过没有地址的项 continue
补充说明
如果你的环境无法运行requests-html的渲染功能,也可以替换为Selenium方案,逻辑完全一致,只需要将获取页面源码的部分替换为Selenium加载页面后获取page_source即可。
如果你只需要提取页面中所有的十六进制地址不需要对应字段名,直接对渲染后的全页源码跑正则匹配0x[a-fA-F0-9]{40}就可以拿到所有符合要求的字符串。
内容的提问来源于stack exchange,提问作者rbutrnz
相关产品推荐
相关产品推荐

