将 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 服务器上实现了此配置以比较结果。
当我在 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 上运行,但对 …
javascript python selenium google-chrome amazon-web-services
我正在使用代理网络,并希望在 Python 上使用 Selenium 对其进行配置。我见过很多帖子使用该HOST:PORT方法,但代理网络使用的“URL方法” http://USER:PASSWORD@PROXY:PORT
我发现SeleniumWire 是一种将代理网络的“URL 方法”连接到 Selenium Scraper 的方法。请参阅基本 SeleniumWire 配置:
from seleniumwire import webdriver
options = {
'proxy':
{
'http': 'http://USER:PASSWORD@PROXY:PORT',
'https': 'http://USER:PASSWORD@PROXY:PORT'
},
}
driver = webdriver.Chrome(seleniumwire_options=options)
driver.get("https://some_url.com")
Run Code Online (Sandbox Code Playgroud)
这正确地添加并循环了驱动程序的代理,但是在许多网站上,爬虫很快就被 CloudFlare阻止。在本地 IP 上运行时不会发生这种阻塞。在搜索 SeleniumWire 的 GitHub Repository Issues后,我发现这是由 TLS 指纹识别引起的,并且当前没有解决此问题的方法。
我尝试以传统的硒方式配置代理:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://USER:PASSWORD@PROXY:PORT")
driver = webdriver.Chrome(options=options)
driver.get("https://some_url.com")
Run Code Online (Sandbox Code Playgroud)
浏览器实例确实打开,但由于网络错误而失败。浏览器实例不会加载到已建立的 URL …