Grm*_*man 20 selenium google-chrome webdriver selenium-chromedriver selenium-webdriver
我在住宅代理网络后面的Ubuntu服务器上通过 Selenium 运行 Chrome 驱动程序。然而,我的硒正在被检测到。有没有办法让 Chrome 驱动程序和 Selenium 100% 无法检测?
我已经尝试了很长时间,但我忘记了我所做的许多事情,包括:
我正在寻找 100% 无法检测到的真正 Selenium 版本。如果那曾经存在过。或者机器人跟踪器无法检测到的另一种自动化方式。
这是浏览器启动的一部分:
sx = random.randint(1000, 1500)
sn = random.randint(3000, 4500)
display = Display(visible=0, size=(sx,sn))
display.start()
randagent = random.randint(0,len(useragents_desktop)-1)
uag = useragents_desktop[randagent]
#this is to prevent ip leaking
preferences =
"webrtc.ip_handling_policy" : "disable_non_proxied_udp",
"webrtc.multiple_routes_enabled": False,
"webrtc.nonproxied_udp_enabled" : False
chrome_options.add_experimental_option("prefs", preferences)
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-impl-side-painting")
chrome_options.add_argument("--disable-setuid-sandbox")
chrome_options.add_argument("--disable-seccomp-filter-sandbox")
chrome_options.add_argument("--disable-breakpad")
chrome_options.add_argument("--disable-client-side-phishing-detection")
chrome_options.add_argument("--disable-cast")
chrome_options.add_argument("--disable-cast-streaming-hw-encoding")
chrome_options.add_argument("--disable-cloud-import")
chrome_options.add_argument("--disable-popup-blocking")
chrome_options.add_argument("--ignore-certificate-errors")
chrome_options.add_argument("--disable-session-crashed-bubble")
chrome_options.add_argument("--disable-ipv6")
chrome_options.add_argument("--allow-http-screen-capture")
chrome_options.add_argument("--start-maximized")
wsize = "--window-size=" + str(sx-10) + ',' + str(sn-10)
chrome_options.add_argument(str(wsize) )
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)
chrome_options.add_argument("blink-settings=imagesEnabled=true")
chrome_options.add_argument("start-maximized")
chrome_options.add_argument("user-agent="+uag)
chrome_options.add_extension(pluginfile)#this is for the residential proxy
driver = webdriver.Chrome(executable_path="/usr/bin/chromedriver", chrome_options=chrome_options)
Run Code Online (Sandbox Code Playgroud)
Deb*_*anB 35
检测到 selenium 驱动的 WebDriver 的事实并不取决于任何特定的Selenium、Chrome或ChromeDriver版本。该网站本身可以检测网络流量,并可以识别浏览器客户端,即Web浏览器作为的webdriver controled。
然而,一些避免在网络抓取时被检测到的通用方法如下:
time.sleep(secs)
。在这里你可以找到关于如何在 python 中休眠 webdriver 毫秒的详细讨论@Antoine Vastel 在他的博客站点Detecting Chrome Headless 中提到了几种方法,它们将Chrome浏览器与无头 Chrome浏览器区分开来。
用户代理:用户代理属性通常用于检测用户的操作系统和浏览器。在 Chrome 版本 59 中,它具有以下值:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/59.0.3071.115 Safari/537.36
Run Code Online (Sandbox Code Playgroud)
可以通过以下方式检查Chrome 无头的存在:
if (/HeadlessChrome/.test(window.navigator.userAgent)) {
console.log("Chrome headless detected");
}
Run Code Online (Sandbox Code Playgroud)Plugins:navigator.plugins
返回浏览器中存在的插件数组。通常,在 Chrome 上我们会找到默认插件,例如Chrome PDF viewer
或Google Native Client
。相反,在无头模式下,返回的数组不包含插件。
可以通过以下方式检查插件是否存在:
if(navigator.plugins.length == 0) {
console.log("It may be Chrome headless");
}
Run Code Online (Sandbox Code Playgroud)语言:在 Chrome 中,有两个 Javascript 属性可以获取user: navigator.language
和使用的语言navigator.languages
。第一个是浏览器 UI 的语言,而第二个是代表用户首选语言的字符串数组。但是,在无头模式下,navigator.languages
返回空字符串。
可以通过以下方式检查语言是否存在:
if(navigator.languages == "") {
console.log("Chrome headless detected");
}
Run Code Online (Sandbox Code Playgroud)WebGL:WebGL 是一种在 HTML 画布中执行 3D 渲染的 API。使用此 API,可以查询图形驱动程序的供应商以及图形驱动程序的渲染器。使用 vanilla Chrome 和 Linux,我们可以获得渲染器和供应商的以下值:Google SwiftShader
和Google Inc.
。在无头模式下,我们可以获得Mesa OffScreen
,这是一种不使用任何窗口系统进行渲染的技术Brian Paul
,它是启动开源 Mesa 图形库的程序。
可以通过以下方式检查是否存在WebGL:
var canvas = document.createElement('canvas');
var gl = canvas.getContext('webgl');
var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
if(vendor == "Brian Paul" && renderer == "Mesa OffScreen") {
console.log("Chrome headless detected");
}
Run Code Online (Sandbox Code Playgroud)并非所有 Chrome headless 都具有相同的供应商和渲染器值。其他人保留也可以在非无头版本上找到的值。但是,Mesa Offscreen
和Brian Paul
表明存在无头版本。
浏览器功能:Modernizr 库可以测试浏览器中是否存在各种 HTML 和 CSS 功能。我们发现 Chrome 和无头 Chrome 之间的唯一区别是后者没有细线功能,该功能检测对hidpi/retina hairlines
.
可以通过以下方式检查是否存在发际线特征:
if(!Modernizr["hairline"]) {
console.log("It may be Chrome headless");
}
Run Code Online (Sandbox Code Playgroud)缺失图像:我们列表中的最后一个似乎也是最健壮的,来自 Chrome 使用的图像尺寸,以防无法加载图像。在普通 Chrome 的情况下,图像的宽度和高度取决于浏览器的缩放比例,但不为零。在无头 Chrome 中,图像的宽度和高度为零。
可以通过以下方式检查是否存在缺失图像:
var body = document.getElementsByTagName("body")[0];
var image = document.createElement("img");
image.src = "http://iloveponeydotcom32188.jg";
image.setAttribute("id", "fakeimage");
body.appendChild(image);
image.onerror = function(){
if(image.width == 0 && image.height == 0) {
console.log("Chrome headless detected");
}
}
Run Code Online (Sandbox Code Playgroud)您可以在以下位置找到一些类似的讨论:
小智 14
为什么不尝试unDetected-chromedriver?
优化的 Selenium Chromedriver 补丁不会触发 Distill Network / Imperva / DataDome / Botprotect.io 等反机器人服务自动下载驱动程序二进制文件并对其进行修补。
已测试至当前 chrome beta 版本 也适用于 Brave 浏览器和许多其他基于 Chromium 的浏览器 Python 3.6++
你可以使用以下命令安装它:pip install undetected-chromedriver
您应该注意一些重要的事情: 由于模块的内部工作原理,需要以编程方式浏览(即:使用 .get(url) )。切勿使用 GUI 进行导航。使用键盘和鼠标进行导航可能会被检测到!新标签:同样的故事。如果您确实需要多个选项卡,请打开带有空白页的选项卡(提示:url 是 data:,包括逗号,是的,驱动程序接受它)并照常进行操作。如果您遵循这些“规则”(实际上是其默认行为),那么您现在将会度过一段愉快的时光。
In [1]: import undetected_chromedriver as uc
In [2]: driver = uc.Chrome()
In [3]: driver.execute_script('return navigator.webdriver')
Out[3]: True # Detectable
In [4]: driver.get('https://distilnetworks.com') # starts magic
In [4]: driver.execute_script('return navigator.webdriver')
In [5]: None # Undetectable!
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
26237 次 |
最近记录: |