网站的脚本能看到浏览器是不是被自动化工具控制吗?这篇在本机让 headless Chrome 加载一个探测页面,把页面自己的 JavaScript 能读到的一批属性和服务器能读到的请求头列出来。只是描述事实,理解自己的爬虫在对方眼里是什么样子;不涉及如何隐藏。
属性 默认启动 加 --enable-automation webdriver False True ← 不同 userAgent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15 brands Chromium/154, Google Chrome/154, Not A(Brand Chromium/154, Google Chrome/154, Not A(Brand platform MacIntel MacIntel languages en-US,en en-US,en plugins 5 5 mimeTypes 2 2 hardwareConcurrency 10 10 maxTouchPoints 0 0 windowChrome object object screen 800x600 800x600 inner 756x469 756x413 ← 不同 outer 756x556 756x556 dpr 1 1 notification default default hasFocus False False visibility visible visible webglRenderer no webgl no webgl voices 0 0 userAgent 完整内容(两种启动方式相同:True):Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/154.0.0.0 Safari/537.36 其中是否含 "HeadlessChrome":True
探测脚本读了 19 项:navigator.webdriver、userAgent、userAgentData.brands、platform、languages、plugins、mimeTypes、hardwareConcurrency、window.chrome、屏幕与窗口尺寸、通知权限、焦点、WebGL 渲染器、语音等。两种启动方式下,只有 navigator.webdriver 和 innerHeight 不同。
默认(我们的启动参数:headless=new + 远程调试端口):
sec-ch-ua-platform: "macOS"
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/154.0.0.0 Safari/537.36
sec-ch-ua: "Chromium";v="154", "Google Chrome";v="154", "Not A(Brand";v="99"
sec-ch-ua-mobile: ?0
再加 --enable-automation:
sec-ch-ua-platform: "macOS"
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/154.0.0.0 Safari/537.36
sec-ch-ua: "Chromium";v="154", "Google Chrome";v="154", "Not A(Brand";v="99"
sec-ch-ua-mobile: ?0Chrome 的 headless 模式在 User-Agent 里就是 HeadlessChrome/154.0.0.0,sec-ch-ua 和 sec-ch-ua-platform 随请求发出。这些是浏览器自己宣布的,爬虫是否应该修改它们是另一个问题(见后面 User-Agent 与联系方式一篇)。
请求头:{'Host': '127.0.0.1:9960', 'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive'}
→ 页面上的脚本只能探测"会执行脚本的客户端";不执行脚本的 HTTP 客户端,服务器只能看到上面这几个请求头用 requests 抓取时,服务器看不到任何脚本探测的结果,只有请求头和连接层的信息(第 15 篇的头顺序、第 13 篇的 TLS 会话、以及 JA3 指纹那一篇)。