背景
尝试开发一个爬虫,绕过谷歌反爬策略并获取谷歌搜索的结果。
技术栈
- docker管理开发环境,操作系统为centos7
- puppeteer-extra-plugin-stealth插件 + chromium浏览器模拟真实用户
- xvfb模拟图形界面环境
相关的实现代码很多,这里不再赘述,只讲解决问题的过程。
问题
开发完成后,发现了一个奇怪的问题。本地运行得很顺利,但同样的docker镜像,同样的代码,部署到数据中心docker环境后,却发现必被google反爬策略拦截(返回验证码界面)。当时分析可能有两个地方有问题:
- ip问题,ip已被google拉黑。
- 宿主机环境问题,虽然镜像一样,但实际上本地和服务端仍然有地方存在区别导致了反爬策略的触发。
一番分析后首先排除问题1,因为本身已经使用了民用ip代理池,但仍然稳定返回验证码,可见并不是ip的问题。
进一步仔细观察docker镜像,发现自己使用的docker镜像配置同步了宿主机的时区,而本地时区为Asia/Shanghai,数据中心的机器时区为UTC。Docker默认会用UTC作为时区,而正常用户的Windows,MacOS系统往往使用的是Asia/Shanghai这种IANA 时区(Area/Location 格式),并不会使用UTC时区。猜测谷歌可能以此作为依据,直接默认对所有时区为UTC的请求返回验证码。利用js修改浏览器能获取到时区后,成功解决问题。
其实谷歌完全可以采取更激进的反爬策略,就是判断用户时区是否与ip属地一致,但猜测可能误伤率过高,并没有开启。