Selenium 启动的浏览器会在调试端口、页面可读属性和启动方式上留下差异。其中一部分属于合理配置,另一部分试图掩盖自动化本身,既没必要也容易失效。
用 Selenium 跑自动化,脚本逻辑写得没错,结果却拿不到,这种事不稀奇。多数人的第一反应是去找一两个参数改掉,但真正让环境露出破绽的,往往不是某个开关,而是几个不同层面上的差异。把这几层分开看,才知道哪些事值得做,哪些事做了也不会有结果。
调试端口和运行时里的东西
Selenium 控制浏览器的方式决定了它会留下两类痕迹。一是浏览器启动时开放的调试端口,外部可以通过它接管页面;二是运行时环境里多出来的东西,比如驱动注入的带 cdc_ 前缀的全局变量、window 上多出来的驱动对象,以及一些对象原型上被改动过的部分。
这些东西的来源不是网页,而是驱动本身。只要用标准方式启动,它们就在那儿,和脚本写得好不好没关系。
页面里读得到的属性
另一类痕迹反过来,它不在驱动里,而在页面能读到的 JS 环境里。最常被提到的是 navigator.webdriver。
这个属性有三种取值。true 表示浏览器正在被自动化工具控制,false 表示没有被控制,undefined 表示拿不到相关信息,通常是浏览器没暴露这个属性或者做过处理。真人访问时它是 false 或 undefined,Selenium 默认启动时它是 true。
围着它还有一整套参数:User-Agent、操作系统与浏览器版本、屏幕分辨率、时区、语言、Canvas、WebGL、AudioContext、字体列表、GPU 型号、CPU 核心数。这些信息拼起来,就是平时说的浏览器指纹。真实用户的设备因为系统、软件和习惯不同,指纹天然是分散的;默认配置下跑起来的浏览器,指纹反而容易呈现出高度雷同的组合,这正是它容易被归入已知模式的原因。
启动方式和渲染时序带来的差异
第三类不落在任何单个属性上,而是启动方式带来的整体差异。
带自动化标志启动、在无头模式下运行、窗口尺寸和屏幕参数对不上、字体渲染与显卡驱动组合不匹配、页面从加载到可交互的时间分布过于整齐,单独看每一项都不算证据,叠在一起就构成一个不太像真人用过的环境。
Headless 是这里最典型的一例。新版 Chrome 的无头模式已经比早几年贴近真实浏览器,但相对普通模式仍然更容易露出自动化特征,在风控严格的站点上尤其明显。
哪些属于可以合理配置的范畴
时区、语言、屏幕分辨率和字体列表,这些并不是自动化独有的东西,真人的设备本来就各不相同。这类参数真正要满足的是自洽:时区跟网络出口的地区对得上,语言跟常用地区对得上,分辨率和硬件画像之间不打架。
说白了,这类配置的目标不是让环境显得特别,而是让它内部讲得通。一台标注为从德国出口访问的设备,浏览器却报着美西时区,系统语言只有英文,屏幕分辨率又是典型的虚拟显示尺寸,这几项凑在一起就已经足够突兀。
这也是为什么环境配置的活儿最好交给能长期保存的载体:今天改了时区、明天忘掉语言,前后对不上,比一次都不改更糟。
哪些属于想隐藏自动化本身,为什么不值得做
还有一类做法是冲着痕迹本身去的:把 navigator.webdriver 抹掉,把驱动注入的变量清掉,把驱动对象藏起来,让检测方读不到自动化状态。
这条路的问题在于,它改的是表象。检测早就不只看某一项了,读属性只是最表层的一步。驱动一升级、检测脚本的执行顺序一变,或者对方干脆绕过 JS,直接去看底层渲染结果和设备特征的组合,之前的处理就失效了。维护成本不低,收益还在持续往下走。
更实际的一点是,这类操作通常正好踩在平台服务条款划出的红线上,也就是绕过技术保护措施。脚本写得再整洁,性质也不会因为改了几个属性而改变。
网络这一层,脚本管不了
浏览器环境挑不出毛病,网络层照样可能把你认出来。这一层看的是 IP 属于数据中心、云服务器还是代理网络,这段 IP 的历史信誉和 ASN,地理定位落在哪,同一 IP 的请求密度有多大,以及它是不是在短时间内访问多个账号、多个页面。请求里带的 Cookie、Session、登录状态也会被拉进来做关联。
这些在脚本里解决不了,只能由环境层处理:每个任务各自的出口,出口地区和环境地区一致,请求节奏可控。做多任务隔离的时候,像 PurpleMark 这类能力通常就落在这里,给每个任务一份独立的浏览器环境与出口,地理参数保持一致。
真被拦住时的排查顺序

顺序大致是:先看网络层,判断 IP 类型、稳定性和地理一致性;再看环境内部是否自洽,时区、语言、分辨率、字体之间有没有互相矛盾;然后看行为节奏,等待是不是固定值、输入是不是一瞬间完成;最后才轮到驱动层的那些自动化属性。
原因不复杂,驱动层那点东西早已不是检测重点。把它摆在排查的第一步,时间基本是白花的。
边界
技术手段能降低被识别的概率,但有几条线不该越:遵守目标站点的 robots 协议与服务条款,不采集个人信息,不绕过技术保护措施,控制请求频率,不影响对方服务的正常运行。


