
本文介绍如何结合 drissionpage(兼容 selenium 思路)自动化访问 dexscreener 加密货币页面,精准定位并触发“复制地址”按钮,再安全可靠地读取剪贴板内容,完整提取合约地址。全程绕过 cloudflare 反爬机制,附可运行代码与关键注意事项。
本文介绍如何结合 drissionpage(兼容 selenium 思路)自动化访问 dexscreener 加密货币页面,精准定位并触发“复制地址”按钮,再安全可靠地读取剪贴板内容,完整提取合约地址。全程绕过 cloudflare 反爬机制,附可运行代码与关键注意事项。
在自动化抓取加密货币数据时,DexScreener 等平台常将关键信息(如 Solana 合约地址)隐藏于交互式“复制按钮”之后——该按钮不直接渲染文本,而是通过 JavaScript 调用 navigator.clipboard.writeText() 写入剪贴板。因此,单纯解析 HTML 无法获取目标内容,必须模拟真实用户行为:导航 → 定位按钮 → 触发点击 → 读取剪贴板。
以下为完整、健壮的实现方案(基于 DrissionPage,因其对 Cloudflare 的兼容性优于原生 Selenium,且语法更简洁):
✅ 完整可运行代码(含显式等待与异常处理)
from DrissionPage import ChromiumPage, ChromiumOptions
import time
import tkinter as tk
# 配置无头模式(可选:设 headless=False 便于调试)
co = ChromiumOptions()
co.set_argument('--no-sandbox')
co.set_argument('--disable-dev-shm-usage')
# 如需绕过 Cloudflare,建议启用指纹伪装(DrissionPage v4.0+ 自动处理大部分检测)
# co.set_local_port(9222) # 若需复用已有浏览器实例,取消注释并启动 chrome --remote-debugging-port=9222
p = ChromiumPage(addr_or_opts=co)
try:
# 访问目标页面(Solana 合约页)
url = "https://dexscreener.com/solana/7bzzop3qb2zk3r7wqrzjs5fpeeergdy3hgzxxrn97aey"
p.get(url)
# 显式等待:等待“Copy Address”按钮出现(推荐使用文本定位,更鲁棒)
copy_btn = p.ele('text:Copy address', timeout=15)
if not copy_btn:
raise RuntimeError("未找到 'Copy address' 按钮,请检查页面结构或网络状态")
# 点击按钮(触发 clipboard 写入)
copy_btn.click()
print("✅ 已点击复制按钮")
# 短暂等待剪贴板写入完成(通常 <100ms,但留足余量)
time.sleep(0.5)
# ✨ 安全读取剪贴板:使用 tkinter(跨平台、无需额外依赖)
root = tk.Tk()
root.withdraw() # 隐藏主窗口
try:
clipboard_text = root.clipboard_get().strip()
if clipboard_text and len(clipboard_text) >= 32: # 基础校验:Solana 地址通常为 base58 编码,长度 ≥32
print(f"? 提取到合约地址:{clipboard_text}")
else:
print("⚠️ 剪贴板内容为空或格式异常,请检查按钮是否真正触发复制")
except tk.TclError:
print("❌ 读取剪贴板失败:可能被系统策略阻止(如 macOS 安全限制)")
finally:
root.destroy()
except Exception as e:
print(f"❌ 执行出错:{e}")
finally:
# p.close() # 生产环境建议保留;调试时可注释以查看页面状态
pass⚠️ 关键注意事项
-
剪贴板权限限制:
- macOS:首次运行需在「系统设置 → 隐私与安全性 → 辅助功能」中手动授权 Python 或终端进程;否则 tkinter.clipboard_get() 会静默失败。
- Windows/Linux:通常无限制,但多实例并发时可能因剪贴板竞争导致读取旧内容(建议单实例 + time.sleep(0.3) 缓冲)。
按钮定位可靠性:
避免依赖易变的 CSS 类名(如 btn-copy)。优先使用 p.ele('text:Copy address') 或 p.ele('xpath://button[contains(., "Copy")]'),语义更强、抗页面更新能力更好。-
Cloudflare 绕过原理:
DrissionPage 底层复用 Chromium 浏览器实例,并自动注入真实用户代理、Canvas/WebGL 指纹、时序行为模拟等,比传统 Selenium + undetected-chromedriver 更稳定。若仍触发拦截,可在 ChromiumOptions 中添加:co.set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...") co.set_argument('--disable-blink-features=AutomationControlled') -
替代方案(JavaScript 直接读取):
若因系统策略无法使用 tkinter,可尝试执行 JS(需页面允许 navigator.clipboard.readText 权限):try: addr = p.run_js('return navigator.clipboard.readText();') print(f"JS 读取地址:{addr}") except Exception as js_err: print("JS 读取失败(需 HTTPS 或 localhost 环境):", js_err)注意:navigator.clipboard.readText() 在非安全上下文(如 http://)中会被浏览器拒绝,DexScreener 为 HTTPS,故可用,但需确保页面已获得焦点。
✅ 总结
本方案以 最小侵入性、最高兼容性 实现了从 DexScreener 动态复制按钮中提取合约地址的核心需求。核心要点在于:
① 使用 DrissionPage 替代原始 Selenium,天然规避多数 Cloudflare 检测;
② 采用语义化元素定位(文本匹配),保障脚本长期可用;
③ 通过 tkinter 安全读取剪贴板,兼顾跨平台与稳定性;
④ 内置超时、异常捕获与基础校验,避免静默失败。
将此逻辑封装为函数后,即可批量处理多个合约页面,构建可靠的链上数据采集流水线。










