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 google-chrome 浏览上下文 的可用性变得更加容易。
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 问题:
概念:
将 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 google-chrome 浏览上下文 的可用性变得更加容易。
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/RendererAWS 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 问题: