
本文介绍如何结合 drissionpage(兼容 selenium 思路)自动化访问 dexscreener 加密货币页面、触发“复制地址”按钮,并安全可靠地读取剪贴板内容,绕过 cloudflare 反爬机制,适用于本地单实例浏览器场景。
本文介绍如何结合 drissionpage(兼容 selenium 思路)自动化访问 dexscreener 加密货币页面、触发“复制地址”按钮,并安全可靠地读取剪贴板内容,绕过 cloudflare 反爬机制,适用于本地单实例浏览器场景。
在加密数据采集实践中,许多去中心化交易所(如 DexScreener)通过动态渲染 + Cloudflare 抗自动化检测(如 ddos-protection, challenge 页面)阻止常规请求。单纯用 requests 或无头模式的原始 Selenium 极易被拦截。而 DrissionPage(基于 Chromium 的国产高兼容性自动化库)因其底层复用真实浏览器上下文、自动处理 UA/JS 环境/WebDriver 特征,已成为绕过 DexScreener 类网站反爬的主流选择。
以下是一套完整、稳定、开箱即用的实现方案,以目标页面 https://dexscreener.com/solana/7bzzop3qb2zk3r7wqrzjs5fpeeergdy3hgzxxrn97aey 为例:
✅ 步骤一:安装依赖并初始化浏览器
pip install DrissionPage
⚠️ 注意:请确保系统已安装 Chrome 浏览器(版本 ≥ 110),DrissionPage 会自动调用本地 Chrome。
✅ 步骤二:访问页面 → 定位并点击「复制地址」按钮
DexScreener 页面中,“Copy Contract Address” 按钮通常为
from DrissionPage import ChromiumPage
from time import sleep
p = ChromiumPage()
p.get('https://dexscreener.com/solana/7bzzop3qb2zk3r7wqrzjs5fpeeergdy3hgzxxrn97aey')
# 等待页面加载完成(推荐用元素存在等待,而非固定 sleep)
p.wait.ele_displayed('button', timeout=15)
# 定位复制按钮:查找包含 "Copy" 文本且 role="button" 的元素(更精准)
copy_btn = p.ele('tag:button@text():Copy')
if not copy_btn:
# 回退策略:尝试通过父容器定位(如含 "Contract Address" 的 section 下的 button)
addr_section = p.ele('xpath://*[@data-testid="token-info"]//span[text()="Contract Address"]/following::button[1]')
copy_btn = addr_section if addr_section else None
if copy_btn:
copy_btn.click()
print("✅ 已点击复制按钮")
else:
raise RuntimeError("❌ 未找到复制按钮,请检查页面结构或网络状态")✅ 步骤三:安全读取剪贴板内容
由于浏览器上下文与 Python 进程隔离,不能直接访问浏览器剪贴板(尤其在无权限模式下)。推荐两种生产级方案:
方案 A:使用 tkinter(推荐 · 本地单实例适用)
✅ 简单可靠|✅ 无需额外权限|❌ 仅限桌面环境、且同一时间仅一个脚本运行(避免 clipboard 冲突)
import tkinter as tk
def get_clipboard_text():
root = tk.Tk()
root.withdraw() # 隐藏主窗口
try:
text = root.clipboard_get()
root.destroy()
return text.strip()
except tk.TclError:
root.destroy()
return ""
# 点击后稍作等待(确保复制完成)
sleep(0.5)
address = get_clipboard_text()
print(f"? 提取的合约地址:{address}")方案 B:执行 JS 调用 navigator.clipboard.readText()(需手动授予权限)
⚠️ 注意:Chrome 默认禁止非用户手势触发的剪贴板读取。若在自动化环境中强制启用,需添加启动参数:
from DrissionPage import ChromiumOptions
opt = ChromiumOptions()
opt.set_local_port(9222) # 可选:指定调试端口
opt.set_argument('--clipboard-read') # 关键!启用剪贴板读取权限
# opt.set_argument('--disable-web-security') # ⚠️ 仅测试用,生产环境禁用
p = ChromiumPage(addr_or_opts=opt)然后执行 JS:
try:
address = p.run_js('return await navigator.clipboard.readText();')
print(f"? JS 提取地址:{address.strip()}")
except Exception as e:
print(f"⚠️ JS 读取失败:{e},回退至 tkinter 方案")
address = get_clipboard_text()✅ 最佳实践与注意事项
- 始终设置显式等待:避免 sleep(5) 等硬编码延迟,改用 p.wait.ele_displayed() 或 p.wait.ele_exist()。
- 按钮点击后加 300–500ms 延迟:确保系统完成复制操作再读取。
-
校验地址格式:Solana 地址为 32 字节 Base58 编码(长度 ≈ 44 字符),可简单验证:
assert 40 <= len(address) <= 46 and address.isalnum(), "❌ 地址格式异常"
- 避免多实例并发:tkinter 剪贴板方案不支持并发;如需批量采集,请改用 API(如有)或服务端代理+JS 注入方案。
- 合规提醒:遵守目标网站 robots.txt 及 Terms of Service;高频采集建议添加合理间隔(≥2s),并考虑使用官方 API(DexScreener 提供 REST API)。
通过以上流程,你即可稳定、可维护地从 DexScreener 自动提取合约地址——既规避了 Cloudflare 检测,又绕开了前端反调试陷阱,是 Web3 数据采集工程中的典型范式。








