Python Selenium AWS Lambda 更改 WebGL Vendor/Renderer 对于不可检测的无头刮板

Python Selenium AWS Lambda Change WebGL Vendor/Renderer For Undetectable Headless Scraper

概念:

将 AWS Lambda 函数与 Python 和 Selenium 结合使用,我想通过传递 headless chrome test 创建一个无法检测到的无头 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,
        )

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


本地 IDE:

下面是 运行ning 在本地 IDE 上的测试结果:


Lambda 服务器:

当我在 Lambda 服务器上 运行 时,WebGL Vendor 和 Renderer 都是空白的。 如下所示:

我什至尝试使用以下 JavaScript 命令手动更改 WebGL Vendor/Renderer:

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);};"})

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

简单地说:

是否可以在 AWS Lambda 上 添加 Vendor/Renderer?在我的努力下,似乎没有什么办法。我确保在 selenium-stealth GitHub 存储库上提交 this issue

WebGL

WebGL 是 cross-platform,基于 OpenGL ES 的 low-level 3D 图形 API 的开放网络标准,通过 HTML5 暴露给 ECMAScript Canvas 元素。 WebGL 的核心是 Shader-based API 使用 GLSL,其结构在语义上类似于底层 OpenGL ES API。它遵循 OpenGL ES 规范,除了 memory-managed 语言之外的一些例外,例如 JavaScript。 WebGL 1.0 公开了 OpenGL ES 2.0 功能集; WebGL 2.0 公开了 OpenGL ES 3.0 API.

现在,随着 Selenium Stealth building of Undetectable Scraper using Selenium driven ChromeDriver initiated 浏览上下文 的可用性变得更加容易。


selenium-stealth

selenium-stealth 是一个 python 包 selenium-stealth 以防止检测。这个程序试图让 python selenium 更隐蔽。但是,截至目前 selenium-stealth 仅支持 Selenium Chrome.

  • 代码块:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    from selenium_stealth import stealth
    
    options = Options()
    options.add_argument("start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    s = Service('C:\BrowserDrivers\chromedriver.exe')
    driver = webdriver.Chrome(service=s, options=options)
    
    # Selenium Stealth settings
    stealth(driver,
          languages=["en-US", "en"],
          vendor="Google Inc.",
          platform="Win32",
          webgl_vendor="Intel Inc.",
          renderer="Intel Iris OpenGL Engine",
          fix_hairline=True,
      )
    
    driver.get("https://bot.sannysoft.com/")
    
  • 浏览器截图:

You can find a detailed relevant discussion in Can a website detect when you are using Selenium with chromedriver?


在 AWS Lambda

中更改 WebGL Vendor/Renderer

AWS Lambda 使我们能够 deliver compressed WebGL websites to end users。当请求的网页 objects 被压缩时,传输大小会减小,从而导致更快的下载、更低的云存储费用和更低的数据传输费用。改进的加载时间也直接影响观众的体验和保留,这有助于提高网站的转化率和可发现性。使用 WebGL,网站更加身临其境,同时仍可通过浏览器访问 URL。通过这种技术AWS Lambda自动压缩上传到S3的objects.

压缩和 WebGL 的背景知识

HTTP 压缩是一种可以内置到 Web 服务器和 Web 客户端中以提高传输速度和带宽利用率的功能。此功能是在服务器和客户端之间使用 HTTP header 协商的,这可能表示正在传输、缓存或以其他方式引用的资源已压缩。 server-side 上的 AWS Lambda 支持 Content-Encoding header.

在 client-side 上,当今大多数浏览器都支持通过 HTTP headers (Accept-Encoding: deflate, br, gzip) 的 brotli 和 gzip 压缩,并且可以处理服务器响应 headers。这意味着在将网页呈现给查看者之前,浏览器将自动从 client-side 的 Web 服务器下载和解压缩内容。


结论

由于此限制,您可能无法更改 AWS Lambda 中的 WebGL Vendor/Renderer,否则它可能会直接影响向查看者呈现网页的过程,并可能成为 UX 中的瓶颈.


tl;博士

您可以在以下位置找到一些相关的详细讨论:

我为缺少的 WebGL Vendor/Renderer 找到的解决方案是在创建函数时使用 docker 容器 而不是普通的 Lambda 层。 不仅存储量增加了 40 倍,而且解决了 WebGL Vendor/Renderer 问题: