如何使用 Selenium 自动化点击并获取剪贴板中的加密货币地址

1次阅读

如何使用 Selenium 自动化点击并获取剪贴板中的加密货币地址

本文介绍如何结合 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 数据采集工程中的典型范式。

text=ZqhQzanResources