用无头浏览器跑采集,代理"配上了",可出口IP还是本机——这种事我前后遇到过三次,每次的窟窿都不一样。第一次是认证框没人点,第二次是IP检测页面看着正常、页面脚本却拿到了真实出口,第三次是多开实例的时候参数串了。把这三处写下来,省的。
坑一:账密代理弹认证框,无头模式没人点
这是最典型的。Chrome 的启动参数里只能写代理地址和端口,没有填账号密码的地方。有头模式跑的时候会弹一个认证框,你手点一下就好了;无头模式没有界面,请求走到认证那一步就卡住或者直接失败,表现出来就是"代理没生效"。
绕法有三个:装一个给代理加认证头的扩展;用 CDP 在请求发出前把 Proxy-Authorization 补上;或者干脆改用白名单授权。
前两种都偏折腾,我现在一律用第三种——把跑采集的机器出口IP加到代理的白名单里,代理侧认IP不认账密,浏览器启动参数里就一个地址加端口,干净利落。
坑二:页面里的脚本能问出你的真实出口
这个是隐形的。我在无头浏览器里打开 IP 检测页,显示的确实是代理IP,看着一切正常。但目标站的页面脚本里如果走了 WebRTC 那一套,是可以绕开代理拿到本机出口的——你以为藏住了,其实没藏。
改法是启动参数里加 --force-webrtc-ip-handling-policy=disable_non_proxied_udp,或者直接把非代理的 UDP 出口掐掉。加完再看一次检测页,WebRTC 那一栏应该显示不出来或者跟代理IP一致。
坑三:多开实例,参数没跟着实例走
我要跑5个任务、每个任务一条独立出口IP,就起了5个浏览器实例。结果跑完一看,5个任务的出口IP是乱的,有的两个任务走的是同一条。
原因是启动参数我写在了共用的那份配置里,实例之间互相覆盖;另外几个实例还共用了同一个用户数据目录,本身就会打架。改成每个实例一份独立的启动参数、独立的用户数据目录,再跑一遍就正常了。
| 坑 | 你看到的现象 | 我的改法 |
|---|---|---|
| 账密代理 | 请求卡住或直接失败 | 改白名单授权,不用账密 |
| WebRTC | 检测页正常,脚本仍拿到真实IP | 关掉非代理 UDP |
| 参数串线 | 多实例出口IP重复 | 每实例独立参数与数据目录 |
| 只看页面能不能开 | 一直在用本机IP而不知情 | 每次启动后断言一次出口IP |
最后一件事:给启动加一道断言
上面三个坑有一个共同点——现象都不是"报错",而是"看起来正常"。所以我后来加了一步:浏览器起来之后,先访问一个能回显出口IP的页面,把返回的IP和这次要用的代理IP比一下,不一致就直接让任务退出。
这一步花了不到十行代码,但把"悄悄在用本机IP"这种情况彻底堵住了。之前我有过一次跑了一整天,回头查数据才发现全是用本机IP采的,白干。
顺带说下代理侧怎么配
无头浏览器这条路,最省事的组合是短效IP加白名单直连:任务起来的时候按需提一批IP,白名单里挂上跑采集那几台机器的出口IP,浏览器这边就只写地址端口。星月代理支持API实时提取、短效IP自动轮换,池子覆盖全国300多个城市、可用率标90%以上,我按20条一批滚动着用,白名单变更也基本是实时的。当然,如果你只有一两台机器、任务量很小,其实固定几条IP慢慢跑也行,不用上这套。
无头浏览器配代理要点:账密认证在无头模式下没人点,优先用白名单授权;关掉非代理 UDP 防止 WebRTC 泄漏真实出口;多实例要各自独立的启动参数和用户数据目录;每次启动后用回显页面断言一次出口IP,别信"页面能打开"。