Python Selenium AWS Lambda 更改 WebGL 供应商/渲染器以实现无法检测的 Headless Scraper

Luk*_*ton 9 javascript python selenium google-chrome amazon-web-services

概念:

将 AWS Lambda 函数与 Python 和 Selenium 结合使用,我想通过无头 chrome 测试来创建无法检测的无头 chrome刮刀。我通过打开测试并截取屏幕截图来检查无头刮刀的不可检测性。我在本地 IDE 和 Lambda 服务器上运行了此测试。


执行:

我将使用一个名为selenium-stealth 的python 库,并将遵循其基本配置:

stealth(driver,
        languages=["en-US", "en"],
        vendor="Google Inc.",
        platform="Win32",
        webgl_vendor="Intel Inc.",
        renderer="Intel Iris OpenGL Engine",
        fix_hairline=True,
        )
Run Code Online (Sandbox Code Playgroud)

我在本地 IDE 和 AWS Lambda 服务器上实现了此配置以比较结果。


本地IDE:

下面是在本地IDE上运行的测试结果: 在此输入图像描述


拉姆达服务器:

当我在 Lambda 服务器上运行此程序时,WebGL 供应商和渲染器都是空白的。如下所示:

在此输入图像描述

我什至尝试使用以下 JavaScript 命令手动更改 WebGL 供应商/渲染器:

driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {"source": "WebGLRenderingContext.prototype.getParameter = function(parameter) {if (parameter === 37445) {return 'VENDOR_INPUT';}if (parameter === 37446) {return 'RENDERER_INPUT';}return getParameter(parameter);};"})
Run Code Online (Sandbox Code Playgroud)

然后我想可能是参数号有问题。我配置了不使用 if 语句的命令执行,但发生了同样的事情:它在我的本地 IDE 上运行,但对 AWS Lambda 服务器没有影响。

简单的说:

是否可以在 AWS Lambda 上添加供应商/渲染器?在我的努力下,似乎没有什么办法了。我确保在 selenium-stealth GitHub 存储库上提交此问题。

Luk*_*ton 1

我找到的针对缺少 WebGL 供应商/渲染器的解决方案是在创建函数时使用docker 容器而不是普通的 Lambda 层。不仅存储增加了 40 倍,而且还解决了 WebGL 供应商/渲染器问题: 在此输入图像描述