Selenium 接管已启动浏览器以绕过反爬检测策略
问题分析
在使用 Selenium 自动化测试爬取拼多多(PDD)时,通过携带 Cookie 登录或控制 Selenium 输入账号密码登录,均出现错误代码 10001:请求异常请升级客户端后重新尝试。
该错误是由于 PDD 能够检测 Selenium 自动化测试脚本,从而阻止其继续访问。目前主流大厂网站基本都能检测到 Selenium 脚本。
解决方案
直接使用 Selenium 自动启动浏览器容易被检测到。测试表明,使用 Selenium 接管已经启动的浏览器则不会触发检测(原因:接管已启动的浏览器所携带的浏览器指纹更接近正常访问的浏览器指纹)。
自动启动与接管的区别
1. Selenium 自动启动浏览器
- 默认行为:Selenium 自动启动浏览器时,通常使用默认配置和设置,生成一个新的用户数据目录,创建全新的浏览器环境。
- 指纹特征:由于是新启动的实例,许多浏览器指纹特征(如 User-Agent、插件列表、屏幕分辨率等)可能与常规用户不同。Selenium 可能在浏览器对象中留下特定标记,如
window.navigator.webdriver属性,易被网站识别。 - 检测风险:网站可通过检测这些指纹特征识别出 Selenium 自动启动的浏览器,采取反爬措施。
2. Selenium 接管已启动的浏览器
- 现有环境:Selenium 接管已启动的浏览器时,使用现有的浏览器实例和用户数据目录,保留之前的会话信息、登录状态、用户设置等。
- 指纹特征:由于使用现有环境,接管后的浏览器指纹特征与常规用户的使用环境更为接近,插件、扩展、User-Agent 等设置保持一致。
- 检测难度:网站在检测接管后的浏览器时,发现其指纹特征与常规用户相似,难以准确识别自动化工具的使用。
3. 区别总结
- 指纹特征一致性:接管已启动的浏览器在指纹特征上与常规用户更为一致。
- 检测风险:接管已启动的浏览器在降低检测风险方面更具优势。
- 使用场景:自动启动适用于需要全新环境的场景;接管已启动的浏览器适用于需要保留现有会话信息的场景。
代码示例
方法一:手动启动浏览器并接管
第一步:找到 Chrome 浏览器的启动路径
默认路径为 C:\Program Files\Google\Chrome\Application,复制进入路径,确认有 chrome.exe 程序。

第二步:在当前路径下打开 CMD
在当前路径下输入 cmd,点击回车。

第三步:利用 Chrome DevTools 协议启动浏览器
在命令行中输入命令,回车:
chrome.exe --remote-debugging-port=9222 --user-data-dir="E:\selenium_data"
-remote-debugging-port=端口号:指定任意打开的端口。-user-data-dir:指定创建新 Chrome 配置文件的目录,确保在单独的配置文件中启动 Chrome,不污染默认配置文件。E:\selenium_data:数据存储目录,可根据需求修改。- 注意:如果失败,请在环境变量 PATH 中添加 Chrome 的路径。
第四步:手动登录目标网站
输入命令回车后会启动一个空白浏览器,接下来手动去登录自己目标网站即可。

第五步:Python 接管浏览器
新建 Python 文件,运行以下代码:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") # 通过端口号接管已打开的浏览器
driver = webdriver.Chrome(options=chrome_options)
print(driver.title) # 打印标题
第六步:验证结果
运行结果成功打印目标网站标题,表示接管成功。

注:通用方法需要手动打开并输入账号密码,基本可以解决所有问题,但不够智能和自动化。
方法二:自动启动浏览器并接管
可以将上一种方式的目标路径设置写入 .bat 文件(Windows 系统),运行 .bat 文件来启动浏览器,再用程序接管。
1. 新建 start_chrome.bat 文件
复制以下内容(注意:chrome.exe 路径改为自己的安装路径,端口号根据实际情况修改):
@echo off
set CHROME_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"
set DEBUG_PORT=9222
%CHROME_PATH% --remote-debugging-port=%DEBUG_PORT%
2. 在 Python 中使用 subprocess 模块启动 .bat 文件
import subprocess
try:
# 一、启动 .bat 文件,确保子进程在 Python 程序关闭后仍能继续运行
# 使用 DETACHED_PROCESS 和 CREATE_NEW_PROCESS_GROUP 标志
DETACHED_PROCESS = 0x00000008
CREATE_NEW_PROCESS_GROUP = 0x00000200
bat_file_path = "start_chrome.bat" # .bat 文件路径
subprocess.Popen([bat_file_path], creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP, shell=True)
print("已启动谷歌浏览器,Python 程序关闭后浏览器将继续运行。")
except Exception as e:
print(f"启动过程中出现错误:{e}")
运行上述代码启动 Chrome 成功,并保留正常启动浏览器的缓存。
3. Python 启动 .bat 文件后,Selenium 通过端口号接管浏览器
import subprocess
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
try:
# 一、启动 .bat 文件
DETACHED_PROCESS = 0x00000008
CREATE_NEW_PROCESS_GROUP = 0x00000200
bat_file_path = "start_chrome.bat"
subprocess.Popen([bat_file_path], creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP, shell=True)
print("已启动谷歌浏览器,Python 程序关闭后浏览器将继续运行。")
# 二、通过端口号去接管启动的浏览器
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(options=chrome_options)
print(driver.title) # 打印页面的标题
# 三、发送请求
url = "https://www.baidu.com"
driver.get(url)
print(driver.title) # 打印页面的标题
# 四、后续操作不易被检测,此处省略...
print('后续操作不易被检测')
except Exception as e:
print(f"启动过程中出现错误:{e}")
此方案实现了自动化启动浏览器并接管,有效降低了被检测的风险。


