Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)
在使用selenium进行web自动化或爬虫的时候,经常会面临登录的情况,对于这种情况,我们可以利用Selenium控制已经打开的浏览器,从而避免每次都需要重新打开浏览器并进行登录的繁琐步骤。
目录
说明
启动浏览器
注意
--user-data-dir说明
代码设定
代码
改进代码
效果
直接使用webdriver
使用指定端口打开的浏览器
说明
说明
这里已打开的浏览器不是指我们在桌面双击打开的浏览器,而是指我们在命令行中指定端口号启动的浏览器,直接控制我们先前桌面双击打开的浏览器内的网页不可行(已验证)。
启动浏览器
启动浏览器时,我们需要使用CMD命令行来使浏览器在指定端口启动
start chrome --remote-debugging-port=9222
#或者
start chrome --remote-debugging-port=9222 --user-data-dir='一个空文件夹的路径'#说明
#其余端口也可以,只要没被占用过就行
#--user-data-dir非必须
在9222端口启动chrome浏览器
start msedge --remote-debugging-port=9222
#或者
start msedge --remote-debugging-port=9222 --user-data-dir='一个空文件夹的路径'#说明
#其余端口也可以,只要没被占用过就行
#--user-data-dir非必须
在9222端口启动Edge浏览器
注意
1.上述命令行启动的浏览器和我们直接在桌面上双击浏览器图标启动的浏览器没有任何差别,只是在我们设定的端口号运行而已。

通过CMD命令(不加--user-data-dir)启动的chrome浏览器
--user-data-dir说明
--user-data-dir用来指定从命令行启动的浏览器的用户数据路径,以chrome浏览器为例,
不加--user-data-dir的话,我们每一次从该端口启动的chrome浏览器的用户数据将直接来源于本机上的原本的chrome浏览器内的用户数据
start chrome --remote-debugging-port=9222
加上--user-data-dir的话,我们第一次运行下方的CMD命令将会发现:
start chrome --remote-debugging-port=9222 --user-data-dir='一个文件夹的路径'
从该端口启动的chrome浏览器将和初始化的chrome浏览器一样,没有任何用户数据,也将没有收藏书签页。
这是因为指定的路径下userdata数据为空,不过在这一次设定好之后,我们再使用上方的CMD命令,每次打开的chrome浏览器又会和第一次设定的一致,因为我们每次启动的chrome浏览器的用户数据都不再为空。

通过CMD命令(加--user-data-dir)启动的chrome浏览器
代码设定
我们使用CMD命令启动了指定端口的浏览器后,接下来要做的就是在代码中设定并与其连接,
连接之后,其余操作与我们正常使用webdriver一致。
代码
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
port=9222
chrome_options=Options()
chrome_options.add_experimental_option('debuggerAddress',f'127.0.0.1:{port}')
browser=webdriver.Chrome(options=chrome_options)
browser.get('url')
#
#
#其余操作逻辑
Chrome浏览器连接已在9222端口打开的浏览器
from selenium import webdriver
from selenium.webdriver.edge.options import Options
port=9222
chrome_options=Options()
chrome_options.add_experimental_option('debuggerAddress',f'127.0.0.1:{port}')
browser=webdriver.Edge(options=chrome_options)
browser.get('url')
#
#
#其余操作逻辑
Edge浏览器连接已在9222端口打开的浏览器
上述代码运行后便会连接到指定端口打开过的对应的浏览器,但是考虑到需要手动打开CMD输入命令比较麻烦,我们可以使用OS库在代码中直接执行前边提到的CMD命令。
于是便有了下边的改进后的代码。
改进代码
#打开已经打开过的谷歌浏览器
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsimport os
def open_chrome(port:int=9222,user_data_dir:str=None):cmd_line=f'start chrome --remote-debugging-port={port}'if user_data_dir:cmd_line+=f' --user-data-dir={user_data_dir}'os.popen(cmd_line)port=9222
user_data_dir=None
open_chrome(port=port,user_data_dir=user_data_dir)
chrome_options=Options()
chrome_options.add_experimental_option('debuggerAddress',f'127.0.0.1:{port}')
browser=webdriver.Chrome(options=chrome_options)
browser.get('url')
#
#
#
打开指定端口打开过的Chrome浏览器
#打开指定端口打开过的Edge浏览器
from selenium import webdriver
from selenium.webdriver.edge.options import Optionsimport os
def open_edge(port:int=9222,user_data_dir:str=None):cmd_line=f'start msedge --remote-debugging-port={port}'if user_data_dir:cmd_line+=f' --user-data-dir={user_data_dir}'os.popen(cmd_line)port=9222
user_data_dir=r"E:\OneDrive\Desktop\Edgedata"
open_edge(port=port,user_data_dir=user_data_dir)
edge_options=Options()
edge_options.add_experimental_option('debuggerAddress',f'127.0.0.1:{port}')
browser=webdriver.Edge(options=edge_options)
browser.get('url')
#
#
#
打开指定端口打开过的Edge浏览器
效果
这里我们以打开小红书并在搜索框内搜索指定内容为例。
直接使用webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium .webdriver.chrome.options import Options
from selenium import webdriver
chrome_options=Options()
chrome_options.add_experimental_option('detach',True)#确保webdriver不会任务完成关闭
browser=webdriver.Chrome(options=chrome_options)
browser.get('https://www.xiaohongshu.com/explore')
browser.maximize_window()
browser.implicitly_wait(10)
search_bar=browser.find_element(By.XPATH,'//*[@id="search-input"]')
browser.execute_script('arguments[0].click()',search_bar)
search_bar.send_keys('哪吒2之魔童闹海')
search_bar.send_keys(Keys.ENTER)

结果
直接使用webdriver打开有弹窗,且还需要传入很多options参数来免除自动化痕迹,面对这种情况我们通常是在代码内加一个手动扫码登录的机制,但是这样比较麻烦,尤其是代码需要反复调试时,每次运行代码都需要手动扫码进行登录,次数太多还有可能被封IP。
使用指定端口打开的浏览器
为了更方便,我们在CMD命令中不使用--user-data-dir参数,这样打开的浏览器的userdata包括各个网站的cookie数据都与先前的浏览器一致,唯一区别就是端口号不一致。
首先,双击打开桌面的Chrome浏览器,并扫码登录小红书。

已经登录了的小红书
接着,关掉打开的Chrome浏览器,直接运行下方代码
#打开指定端口打开过的Chrome浏览器
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium import webdriverimport os
def open_chrome(port:int=9222,user_data_dir:str=None):cmd_line=f'start chrome --remote-debugging-port={port}'if user_data_dir:cmd_line+=f' --user-data-dir={user_data_dir}'os.popen(cmd_line)port=9222
user_data_dir=None
open_chrome(port=port,user_data_dir=user_data_dir)
chrome_options=Options()
chrome_options.add_experimental_option('debuggerAddress',f'127.0.0.1:{port}')
browser=webdriver.Chrome(options=chrome_options)
browser.get('https://www.xiaohongshu.com/explore')
browser.maximize_window()
browser.implicitly_wait(10)
search_bar=browser.find_element(By.XPATH,'//*[@id="search-input"]')
browser.execute_script('arguments[0].click()',search_bar)
search_bar.send_keys('哪吒2之魔童闹海')
search_bar.send_keys(Keys.ENTER)
运行结果
可以看到,我们在options选项中并没有指定任何消除自动化控制痕迹的argument然而左上角却没有受到自动测试软件控制字样的infobar,并且一打开网页便是登录状态,这说明我们启动的不是webdriver而是已经连接到的Chrome浏览器。
说明
1. Edge浏览器的连接方法与上文案例中所示的Chrome浏览器连接方法一致,只不过,作者本人电脑上在测试时总是需要在CMD命令中指定--user-data-dir参数才可以正常运行,即使这样也没关系,你可以先运行open_edge()函数,然后打开新的edge后点击一键导入数据然后之后正常使用即可。
import os
def open_edge(port:int=9222,user_data_dir:str=None):cmd_line=f'start msedge --remote-debugging-port={port}'if user_data_dir:cmd_line+=f' --user-data-dir={user_data_dir}'os.popen(cmd_line)port=9222
user_data_dir=r"E:\OneDrive\Desktop\Edgedata"
open_edge(port=port,user_data_dir=user_data_dir)
打开指定端口的edge浏览器

点击是,继续后就会将原来edge的userdata全部导入的你传入的文件夹内,之后你每次带着--user-data-dir=‘文件夹路径’ 这一参数运行即可。
2.连接到已经打开过的浏览器进行自动化的话,除了用来设置连接端口的options,其余options都将失效,即使传入也不会有任何变化,因为那些options都是给webdriver设置的,我们现在正在操控的是浏览器实例!
相关文章:
Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)
在使用selenium进行web自动化或爬虫的时候,经常会面临登录的情况,对于这种情况,我们可以利用Selenium控制已经打开的浏览器,从而避免每次都需要重新打开浏览器并进行登录的繁琐步骤。 目录 说明 启动浏览器 注意 --user-data-dir说明 代码设定 代码 改进代…...
AF3 unify_template_features 函数解读
AlphaFold3 data_pipeline 模块的 unify_template_features 函数用于将多条链的模板特征整合为一个统一的 FeatureDict,以适应对多链复合物的处理。每条链的模板特征经过索引偏移处理后,拼接为一个完整的模板特征矩阵。 该方法的核心在于: 序列对齐:根据每条链的长度,将模…...
FFmpeg.NET:.NET 平台上的音视频处理利器
FFmpeg.NET 是一个封装了 FFmpeg 功能的 .NET 库,能够方便地在 C# 项目中处理音视频文件。它支持多种操作,包括转码、剪辑、合并、分离音频等。 功能 解析元数据从视频生成缩略图使用以下参数将音频和视频转码为其他格式: 码率(…...
解决 Git 合并冲突:当本地修改与远程提交冲突时
目录 错误原因分析 解决方法 1. 暂存本地修改并合并(保留更改) 2. 丢弃本地修改(强制覆盖) 3. 暂存修改后合并(推荐:使用 git stash) 4. 选择性合并(手动处理冲突文件…...
SOME/IP-SD -- 协议英文原文讲解5
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.5 S…...
spark的一些指令
一,复制和移动 1、复制文件 格式:cp 源文件 目标文件 示例:把file1.txt 复制一份得到file2.txt 。那么对应的命令就是:cp file1.txt file2.txt 2、复制目录 格式:cp -r 源文件 目标文件夹 示例:把目…...
Redis常用数据类型及其应用案例
文章目录 Redis常用数据类型及其应用案例1. 字符串(String)1.1 简介1.2 应用案例1.2.1 缓存1.2.2 计数器 2. 哈希(Hash)2.1 简介2.2 应用案例2.2.1 存储用户信息2.2.2 购物车 3. 列表(List)3.1 简介3.2 应用…...
kafka数据拉取和发送
文章目录 一、原生 KafkaConsumer1、pom文件引入kafka2、拉取数据3、发送数据二、在spring boot中使用@KafkaListener1、添加依赖2、application.yml3、消息拉取:consumer4、自定义ListenerContainerFactory5、消息发送:producer6、kafka通过clientId鉴权时的鉴权失败问题一、…...
LLM全栈框架完整分类清单(预训练+微调+工具链)
一、预训练框架 1. 大规模分布式训练框架 框架名称核心能力GitHub地址Megatron-LM3D并行训练、FlashAttention支持、Transformer架构优化(NVIDIA生态)NVIDIA/Megatron-LMDeepSpeedZeRO优化系列、3D并行、RLHF全流程支持(微软生态)…...
蓝桥杯备考:贪心算法之矩阵消除游戏
这道题是牛客上的一道题,它呢和我们之前的排座位游戏非常之相似,但是,排座位问题选择行和列是不会改变元素的值的,这道题呢每每选一行都会把这行或者这列清零,所以我们的策略就是先用二进制把选择所有行的情况全部枚举…...
【Matlab仿真】Matlab Function中如何使用静态变量?
背景 根据Simulink的运行机制,每个采样点会调用一次MATLAB Function的函数,两次调用之间,同一个变量的前次计算的终值如何传递到当前计算周期来?其实可以使用persistent变量实现函数退出和进入时内部变量值的保持。 persistent变…...
DeepSeek 提示词:高效的提示词设计
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
深入学习Java中的Lambda表达式
深入学习Java中的Lambda表达式 自Java 8引入以来,Lambda表达式彻底改变了Java的编程风格,让代码变得更加简洁、易读,尤其是在函数式编程的场景中。接下来,我们将深入探讨Lambda表达式的语法、原理以及实际应用,帮助你…...
1.2 AI 量化炒股的起源与发展
**定性价值**:AI量化炒股通过算法模型实现投资决策自动化,显著提升交易效率与风险控制能力,打破传统人工交易的主观性与延迟性,推动金融科技向智能化、数据驱动方向迭代,具有颠覆传统投资模式的战略意义。 **定量价值…...
计算机单位之详解——存储单位Byte 网络传输单位bps 视频码率单位bps
前言: 计算机里面单位有点复杂,容易混淆,很多时候混起来就容易概念不理解,包括一些小问题,比如说:为什么我买了1T硬盘,实际存在虚标。为什么所谓的千兆宽带,下载起来没有1G每秒&…...
IDEA关闭SpringBoot程序后仍然占用端口的排查与解决
IDEA关闭SpringBoot程序后仍然占用端口的排查与解决 问题描述 在使用 IntelliJ IDEA 开发 Spring Boot 应用时,有时即使关闭了应用,程序仍然占用端口(例如:4001 端口)。这会导致重新启动应用时出现端口被占用的错误&a…...
deepseek清华大学第二版 如何获取 DeepSeek如何赋能职场应用 PDF文档 电子档(附下载)
deepseek清华大学第二版 DeepSeek如何赋能职场 pdf文件完整版下载 https://pan.baidu.com/s/1aQcNS8UleMldcoH0Jc6C6A?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/3ee62050a2ac...
【python随手记】——读取文本文件内容转换为json格式
文章目录 前言一、TXT文件转换为JSON数组1.txt文件内容2.python代码3.输出结果 二、TXT文件转换为JSON对象1.txt文件2.python代码3.输出结果 前言 场景:用于读取包含空格分隔数据的TXT文件,并将其转换为结构化JSON文件 一、TXT文件转换为JSON数组 1.tx…...
k8s集群3主5从高可用架构(kubeadm方式安装k8s)
关键步骤说明 环境准备阶段 系统更新:所有节点执行yum/apt update确保软件包最新时间同步:通过ntpdate time.windows.com或部署NTP服务器网络规划:明确划分Service网段(默认10.96.0.0/12)和Pod网段(如Flann…...
基于 sklearn 的均值偏移聚类算法的应用
基于 sklearn 的均值偏移聚类算法的应用 在机器学习和数据挖掘中,聚类算法是一类非常重要的无监督学习方法。它的目的是将数据集中的数据点划分为若干个类,使得同一类的样本点彼此相似,而不同类的样本点相互之间差异较大。均值偏移聚类&…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
