如何用Python获取当前运行浏览器的所有URL(不使用Selenium)
已运行浏览器实时打开标签页URL获取方案
报错原因说明
你遇到的sqlite3.OperationalError: database is locked报错,是因为Chromium内核浏览器(包括Brave)运行时会对历史记录数据库文件加独占锁,禁止外部进程直接读写。且即便你复制数据库副本读取,拿到的也是历史访问记录,不是当前实时打开的标签页URL,不符合需求。
可行实现方案
两种方案均满足不是通过Selenium启动浏览器再获取链接的要求,可直接读取已运行浏览器的标签页URL:
方案1:基于Windows UI自动化获取(无需修改浏览器配置)
通过pywinauto库调用Windows原生UI接口,直接读取Brave窗口地址栏的内容,无需改动浏览器启动参数,适合临时使用。
- 依赖安装:
pip install pywinauto
- 实现代码:
from pywinauto import Application # 连接到正在运行的Brave浏览器进程 app = Application(backend='uia').connect(title_re='.*Brave', class_name='Chrome_WidgetWin_1') all_urls = [] # 遍历所有打开的Brave窗口获取地址栏内容 for window in app.windows(class_name='Chrome_WidgetWin_1'): # 定位Chromium内核浏览器的地址栏控件 address_bar = window.child_window(control_type='Edit', name='地址和搜索栏') if address_bar.exists(): url = address_bar.get_value() if url: all_urls.append(url) print("当前打开的所有URL:") for url in all_urls: print(url)
- 注意:如果Brave设置了多用户配置,仅需调整窗口匹配规则即可正常使用。
方案2:基于浏览器远程调试接口获取(数据更准确)
通过开启Brave的远程调试端口,调用官方调试接口直接获取所有标签页的URL,不受UI层级、窗口状态影响,数据准确性更高。
- 配置浏览器启动参数:
- 右键Brave桌面快捷方式,选择「属性」
- 在「目标」输入框的原有内容末尾,添加空格后输入
--remote-debugging-port=9222 - 关闭所有Brave进程后,通过该快捷方式重启浏览器
- 依赖安装:
pip install requests
- 实现代码:
import requests # 调用本地调试接口获取所有标签页信息 res = requests.get('http://127.0.0.1:9222/json') tabs = res.json() # 筛选页面类型的标签页,排除插件、后台进程等非页面内容 all_urls = [tab['url'] for tab in tabs if tab['type'] == 'page'] print("当前打开的所有URL:") for url in all_urls: print(url)
- 注意:9222端口如果被占用,可以替换为其他未被占用的端口,确保和启动参数里的端口一致即可。
两种方案都适用于所有Chromium内核浏览器,包括Chrome、Edge等,仅需调整窗口匹配规则或对应浏览器的启动参数即可,无需改动核心逻辑。
内容的提问来源于stack exchange,提问作者Johan Jomy
相关产品推荐
相关产品推荐

