Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)

news/2025/2/26 12:58:39

        在使用selenium进行web自动化或爬虫的时候,经常会面临登录的情况,对于这种情况,我们可以利用Selenium控制已经打开的浏览器,从而避免每次都需要重新打开浏览器并进行登录的繁琐步骤。    

目录

说明

启动浏览器

 注意

--user-data-dir说明

 代码设定

代码

改进代码

效果

直接使用webdriver

使用指定端口打开的浏览器

说明


    

说明

        这里已打开的浏览器不是指我们在桌面双击打开的浏览器,而是指我们在命令行中指定端口号启动的浏览器,直接控制我们先前桌面双击打开的浏览器内的网页不可行(已验证)。

启动浏览器

启动浏览器时,我们需要使用CMD命令行来使浏览器在指定端口启动

python">start chrome --remote-debugging-port=9222 
#或者
start chrome --remote-debugging-port=9222 --user-data-dir='一个空文件夹的路径'

#说明
#其余端口也可以,只要没被占用过就行
#--user-data-dir非必须

在9222端口启动chrome浏览器 

python">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浏览器内的用户数据

python">start chrome --remote-debugging-port=9222 

        加上--user-data-dir的话,我们第一次运行下方的CMD命令将会发现:

python">start chrome --remote-debugging-port=9222 --user-data-dir='一个文件夹的路径'

        从该端口启动的chrome浏览器将和初始化的chrome浏览器一样,没有任何用户数据,也将没有收藏书签页。

        这是因为指定的路径下userdata数据为空,不过在这一次设定好之后,我们再使用上方的CMD命令,每次打开的chrome浏览器又会和第一次设定的一致,因为我们每次启动的chrome浏览器的用户数据都不再为空。

 通过CMD命令(加--user-data-dir)启动的chrome浏览器

 代码设定

        我们使用CMD命令启动了指定端口的浏览器后,接下来要做的就是在代码中设定并与其连接,

连接之后,其余操作与我们正常使用webdriver一致。

代码

python">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端口打开的浏览器

python">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命令。

        于是便有了下边的改进后的代码。

改进代码

python">#打开已经打开过的谷歌浏览器
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

import 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浏览器

python">#打开指定端口打开过的Edge浏览器
from selenium import webdriver
from selenium.webdriver.edge.options import Options

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_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

python">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浏览器,直接运行下方代码 

python">#打开指定端口打开过的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 webdriver

import 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后点击一键导入数据然后之后正常使用即可。

python">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设置的,我们现在正在操控的是浏览器实例!


http://www.niftyadmin.cn/n/5868731.html

相关文章

每天一个Flutter开发小项目 (4) : 构建收藏地点应用 - 深入Flutter状态管理

引言 欢迎回到 每天一个Flutter开发小项目 系列博客!在前三篇博客中,我们从零开始构建了计数器应用、待办事项列表应用,以及简易天气应用。您不仅掌握了 Flutter 的基础组件和布局,还学习了网络请求、JSON 解析等实用技能,更重要的是,我们一起探讨了高效的 Flutter 学习…

Redis面试知识点总结

目录 1. Redis 基础知识2. 基本数据结构(底层实现)2.1 SDS2.2 链表2.3 字典2.4 跳跃表2.5 整数集合2.6 压缩列表 3. 对象3.1 字符串对象3.2 列表对象3.3 哈希对象3.4 集合对象 set3.5 有序集合对象 zset 4. 数据库4.1 RDB 持久化4.2 AOF 持久化4.3 数据淘…

力扣2454. 下一个更大元素 IV

力扣2454. 下一个更大元素 IV 题目 题目解析及思路 题目要求对于每个数&#xff0c;找到右边比它大的第二个数&#xff0c;并记录在ans数组中 如果是右边第一个大的&#xff0c;就用一个递减栈即可&#xff0c;栈顶元素如果<当前元素则弹出 第二个大数就要利用弹出的栈顶…

AI大模型(四)基于Deepseek本地部署实现模型定制与调教

AI大模型&#xff08;四&#xff09;基于Deepseek本地部署实现模型定制与调教 DeepSeek开源大模型在榜单上以黑马之姿横扫多项评测&#xff0c;其社区热度指数暴涨、一跃成为近期内影响力最高的话题&#xff0c;这个来自中国团队的模型向世界证明&#xff1a;让每个普通人都能…

leetcode_动态规划/递归 70. 爬楼梯

70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路&#xff1a; 考虑: 假设现在已经爬到了某一阶台阶&#xff0c;那是如何到达这里的呢&#xff1f;可能是从前一阶台阶爬上来的&am…

服务器硬件老化导致性能下降的排查与优化

当服务器硬件老化导致性能下降时&#xff0c;以下是一些排查和优化方法&#xff1a; ### 排查问题&#xff1a; 1. **性能监控&#xff1a;** - 使用监控工具&#xff08;如Prometheus、Grafana&#xff09;监视服务器性能指标&#xff0c;包括CPU利用率、内存使用、磁盘I…

使用python接入腾讯云DeepSeek

本文主要从提供SSE方式接入DeepSeek&#xff0c;并通过fastapi websocket对外提供接入方法。 参考文档&#xff1a; 腾讯云大模型&#xff1a;https://cloud.tencent.com/document/product/1759/109380 fastAPI官网&#xff1a;https://fastapi.tiangolo.com/ WebSocketManager…

Python从0到100(八十九):Resnet、LSTM、Shufflenet、CNN四种网络分析及对比

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…