100天精通Python(爬虫篇)——第122天:基于selenium接管已启动的浏览器(反反爬策略)

100天精通Python(爬虫篇)——第122天:基于selenium接管已启动的浏览器(反反爬策略)

文章目录


1、问题描述

使用selenium自动化测试爬取pdd的时候,通过携带cookie登录或者控制selenium输入账号密码登录,都出现了:错误代码10001:请求异常请升级客户端后重新尝试


2、问题推测

这个错误的产生是由于pdd可以检测selenium自动化测试的脚本,因此可以阻止selenium的继续访问。现在大厂网站基本上都能检测到selenium脚本了。


3、解决方法

直接用selenium启动浏览器会被检测到,博主测试用selenium接管已经启动的浏览器就不会(原因:接管已经启动的浏览器所携带的浏览器指纹 ≈ 正常访问的浏览器指纹)


使用selenium自动启动浏览器和接管已启动的浏览器,在浏览器指纹方面存在一些区别。以下是详细的分析:

3.1 selenium自动启动浏览器

  1. 默认行为
    • selenium在自动启动浏览器时,通常会使用默认的配置和设置。
    • 浏览器会生成一个新的用户数据目录,这意味着它会创建一个全新的浏览器环境,与之前的会话或用户数据无关。
  2. 指纹特征
    • 由于是新启动的浏览器实例,许多浏览器指纹特征(如用户代理、插件列表、屏幕分辨率等)可能会与常规用户有所不同。
    • selenium可能会在浏览器对象中留下一些特定的标记,如 window.navigator.webdriver 属性,这可能会被网站用来检测自动化工具的使用。
  3. 检测风险
    • 网站可能会通过检测这些指纹特征来识别出 selenium自动化启动的浏览器,从而采取反爬措施,如限制访问、封禁账号等。

3.2 selenium接管已启动的浏览器

  1. 现有环境
    • selenium接管已启动的浏览器时,会使用现有的浏览器实例和用户数据目录。
    • 这意味着浏览器会保留之前的会话信息、登录状态、用户设置等。
  2. 指纹特征
    • 由于是使用现有的浏览器环境,接管后的浏览器指纹特征与常规用户的使用环境更为接近。
    • 浏览器中的插件、扩展、用户代理等设置都会与常规用户保持一致,这有助于降低被检测的风险。
  3. 检测难度
    • 网站在检测接管后的浏览器时,可能会发现其指纹特征与常规用户更为相似,从而难以准确识别出自动化工具的使用。
    • 然而,如果 selenium在接管过程中留下了特定的标记或行为模式,仍然有可能被网站检测到。

3.3 区别总结

  • 指纹特征一致性:接管已启动的浏览器在指纹特征上与常规用户更为一致,而自动启动的浏览器则可能因默认配置和设置而与常规用户有所不同。
  • 检测风险:由于指纹特征的一致性差异,接管已启动的浏览器在降低检测风险方面可能更具优势。
  • 使用场景:自动启动浏览器适用于需要全新浏览器环境的场景,而接管已启动的浏览器则适用于需要保留现有会话信息或用户设置的场景。

4、代码实战


4.1 手动方法(手动打开浏览器输入账号密码)

第一步:找到谷歌浏览器的启动路径,默认在:C:\Program Files\Google\Chrome\Application复制去打开进入路径,如下所示有chrome.exe程序(待会我们需要启动它):


在这里插入图片描述



第二步:当前路径下输入cmd,点击回车:


在这里插入图片描述




进入cmd控制台:


在这里插入图片描述


第三步:我们可以利用Chrome DevTools协议。它允许客户检查和调试Chrome浏览器。在命令行中输入命令,回车:

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文件,运行以下代码:

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(chrome_options=chrome_options)print(driver.title)# 打印标题

第六步:运行结果,成功打印目标网站标题,表示接管成功

在这里插入图片描述

问题描述:通用方法需要手动打开,手动输入账号密码,基本可以解决所有问题,但是不够智能不够自动化


4.2 自动方法(.bat文件启动的浏览器)

可以把上一种方式的目标路径设置写进 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 中启动 .bat 文件可以借助subprocess模块实现(注意:start_chrome.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}")

运行上面代码启动谷歌成功,并且保留我们正常启动浏览器的缓存:

在这里插入图片描述

3、python启动 .bat 文件,然后selenium通过端口号去接管浏览器:

import subprocess from selenium import webdriver from selenium.webdriver.chrome.options import Options 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 程序关闭后浏览器将继续运行。")# 二、通过端口号去接管启动的浏览器 chrome_options = Options() chrome_options.add_experimental_option("debuggerAddress","127.0.0.1:9222")# 创建 Chrome 浏览器实例 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}")

运行动图展示:

在这里插入图片描述

4、后续再去干别的操作就不容易被检测了,代码省略…

Read more

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

摘要:本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求,帮助开发者真正实现OpenClaw从“能用”到“放心用”的跨越。 优质专栏欢迎订阅! 【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】【YOLOv11工业级实战】 【机器视觉:C# + HALCON】【大模型微调实战:平民级微调技术全解】 【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】【数字孪生与仿真技术实战指南】 【AI工程化落地与YOLOv8/v9实战】【C#工业上位机高级应用:高并发通信+性能优化】 【Java生产级避坑指南:

By Ne0inhk
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门: 《freertos专栏》《STM32 HAL库专栏》 ⭐️流水不争先,争的是滔滔不绝  📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生 | 省级优秀毕业生获得者 | ZEEKLOG新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生 在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连 目录 前言  一、实验基础说明 1.1、互斥体简介 1.2 本次实验设计思路 二、硬件原理分析(看过之前博客的可以忽略) 三、实验程序编写 3.1 互斥体 LED 驱动代码(mutex.c) 3.2.1、设备结构体定义(28-39

By Ne0inhk
Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 后端工程师扔给你一个 Swagger (OpenAPI) 文档地址,你会怎么做? 1. 对着文档,手写 Dart Model 类(容易写错字段类型)。 2. 手写 Retrofit/Dio 的 API 接口定义(容易拼错 URL)。 3. 当后端修改了字段名,你对着报错修半天。 这是重复劳动的地狱。 swagger_dart_code_generator 可以将 Swagger (JSON/YAML) 文件直接转换为高质量的 Dart 代码,包括: * Model 类:支持 json_serializable,带 fromJson/

By Ne0inhk
Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

文章目录 * 前言 * make/makefile * 文件的三个时间 * Linux第一个小程序-进度条 * 回车和换行 * 缓冲区 * 程序的代码展示 * git指令 * 关于gitee * Linux调试器-gdb使用 * 作业部分 前言 做 Linux 开发时,你是不是也遇到过这些 “卡脖子” 时刻?写 makefile 时,明明语法没错却报错,最后发现是依赖方法行没加 Tab;想提交代码到 gitee,记不清 git add/commit/push 的 “三板斧”,还得反复搜教程;用 gdb 调试程序,输了命令没反应,才想起编译时没加-g生成 debug 版本;甚至连写个进度条,都搞不懂\r和\n的区别,导致进度条乱跳…… 其实这些问题,

By Ne0inhk