我们经常会拿selenium进行自动登录来搭建cookie池,对于不想自己网站被爬的站主/开发人员来说,防止自动化脚本操作网站自然是反爬必须要做的工作。那么,他们究竟有哪些手段来检测用户是否是selenium呢?今天就来总结一下常见的识别selenium的方法以及各种解决之道。
WebDriver识别
爬虫程序可以借助渲染工具从动态网页中获取数据,“借助”其实是通过对应的浏览器驱动(及Webdriver)向浏览器发出指令的行为。也就是说,开发者可以根据客户端是否包含浏览器驱动这一特征来区分正常用户和爬虫程序。
识别的原理
网页只要设置了检查webdriver的Javascript方法,就很容易发现爬虫。使用的方法就是Navigator对象的webdriver属性,用这个属性来判断客户端是否通过WebDriver驱动浏览器。如果监测到客户端的webdriver属性存在,则无法继续操作获取数据。selenium,Puppeteer都存在WebDriver属性。
监测结果有3种,分别是
-
true
-
false
-
undefind。
最广为人知的识别是否是selenium的方法就是 window.navigator.webdriver
,当浏览器被打开后,js就会给当前窗口一个window属性,里面存放着用户的各种"信息"。
使用渲染工具有 webdriver 属性时,navigation.webdriver的返回值时true。反之则会返回false或者undefind。
正常用户访问时的 webdriver 为 undefined
selenium访问时为true
简单的js来反爬 selenium
<script>
if(window.navigator.webdriver == true){
document.write("<span>看到这段就代表你是爬虫</span>")
}else{
document.write("<span>真正的信息在这儿呢</span>")
}
</script>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 现在把这段代码保存到HTML中分别正常打开和selenium打开
-
selenium打开
-
正常浏览器打开
其实,不只是webdriver,selenium打开浏览器后,还会有这些特征码:
webdriver
__driver_evaluate
__webdriver_evaluate
__selenium_evaluate
__fxdriver_evaluate
__driver_unwrapped
__webdriver_unwrapped
__selenium_unwrapped
__fxdriver_unwrapped
_Selenium_IDE_Recorder
_selenium
calledSelenium
_WEBDRIVER_ELEM_CACHE
ChromeDriverw
driver-evaluate
webdriver-evaluate
selenium-evaluate
webdriverCommand
webdriver-evaluate-response
__webdriverFunc
__webdriver_script_fn
__$webdriverAsyncExecutor
__lastWatirAlert
__lastWatirConfirm
__lastWatirPrompt
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
只要识别到这些,那么该用户就是selenium无误了
WebDriver识别的绕过方法
了解了WebDriver识别的原理和返回值后,我们就能相处应对的办法。既然 Web Driver 的识别依赖navigation.webdriver
的返回值,那么我们在触发Javascript办法前将navigation.webdriver的返回值改为false或者undefind,问题就解决了。
script = 'Object.defineProperty(navigator,"webdriver",{get:() => false,});'
- 1
示例:
from selenium.webdriver import Chrome
import time
- 1
- 2