2023年6月29日发(作者:)
⽹站如何识别你是selenium爬⾍?那我们怎么解决(反反爬)我们经常会拿selenium进⾏⾃动登录来搭建cookie池,对于不想⾃⼰⽹站被爬的站主/开发⼈员来说,防⽌⾃动化脚本操作⽹站⾃然是反爬必须要做的⼯作。那么,他们究竟有哪些⼿段来检测⽤户是否是selenium呢?今天就来总结⼀下常见的识别selenium的⽅法以及各种解决之道。WebDriver识别爬⾍程序可以借助渲染⼯具从动态⽹页中获取数据,“借助”其实是通过对应的浏览器驱动(及Webdriver)向浏览器发出指令的⾏为。也就是说,开发者可以根据客户端是否包含浏览器驱动这⼀特征来区分正常⽤户和爬⾍程序。识别的原理⽹页只要设置了检查webdriver的Javascript⽅法,就很容易发现爬⾍。使⽤的⽅法就是Navigator对象的webdriver属性,⽤这个属性来判断客户端是否通过WebDriver驱动浏览器。如果监测到客户端的webdriver属性存在,则⽆法继续操作获取数据。selenium,Puppeteer都存在WebDriver属性。监测结果有3种,分别是truefalseundefind。最⼴为⼈知的识别是否是selenium的⽅法就是
ver,当浏览器被打开后,js就会给当前窗⼝⼀个window属性,⾥⾯存放着⽤户的各种"信息"。使⽤渲染⼯具有 webdriver 属性时,ver的返回值时true。反之则会返回false或者undefind。正常⽤户访问时的 webdriver 为 undefinedselenium访问时为true简单的js来反爬 selenium1. 现在把这段代码保存到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
只要识别到这些,那么该⽤户就是selenium⽆误了WebDriver识别的绕过⽅法了解了WebDriver识别的原理和返回值后,我们就能相处应对的办法。既然 Web Driver 的识别依赖ver的返回值,那么我们在触发Javascript办法前将ver的返回值改为false或者undefind,问题就解决了。script = 'Property(navigator,"webdriver",{get:() => false,});'⽰例:from ver import Chromeimport timebrower = Chrome(executable_path=r'D:pythonchromedriver_')url = '/features/'(url)script = 'Property(navigator,"webdriver",{get:() => false,});'#运⾏e_script(script)#定位按钮并点击_element_by_css_selector('.-lg').click()#定位到⽂章内容元素elements = _element_by_css_selector('#content')(1)print()()值得⼀提的是,淘宝的登录滑块验证页⾯也是⽤到了这个⽅法,使⽤selenium套件操作滑块后会出现“哎呀,出错了,点击刷新再来⼀次”这样的提⽰。注意: 这种修改该属性值的办法只在当前页⾯有效,当浏览器打开新标签或新窗⼝时需要重新执⾏改变ver值的JavaScript代码。其他的解决办法1. 使⽤⽕狐浏览器很多时候selenium+⾕歌打不开⽬标⽹站,都可以⽤⽕狐试试。因为selenium只是⼀个控制浏览器的⼯具,⽽chromedriver和geckodriver都不是selenium官⽅发布的(⿁知道谁发布的),因此在控制浏览器⽅⾯会有不同的差异,具体原理不再赘述,总之很多⽹站不能⽤selenium+chrome就可以试试firefox。(理论上IE也可能会达到相应效果,但IE内核实在太烂了,selenium+IE=龟速爬⾍)2. 给 webdriver 的 options增加参数⾕歌浏览器的设置中有⼀个参数名为excludeSwitches,它的值是⼀个数组,向⾥⾯添加chrome的命令就可以在selenium打开chrome后⾃动执⾏数组内的指令,我们向⾥⾯添加⼀个enable-automationfrom selenium import webdriverfrom ver import ChromeOptionsoption = ChromeOptions()_experimental_option('excludeSwitches', ['enable-automation'])brower = (options=option)('file:///C:/Users/Administrator/Desktop/')此时运⾏这段代码,发现可以拿到正确的信息3. 中间⼈代理mitmproxymitmproxy其实和 fiddler/charles 等抓包⼯具的原理有些类似,作为⼀个第三⽅,它会把⾃⼰伪装成你的浏览器向服务器发起请求,服务器返回的response会经由它传递给你的浏览器,你可以通过编写脚本来更改这些数据的传递,从⽽实现对服务器的“欺骗”和对客户端的“欺骗”。具体原理和使⽤见此下⾯提供⼀个防屏蔽selenium的简单demo# my_ mitmproxy import ctx
def response(flow):
# 'js'字符串为⽬标⽹站的相应js名
if 'js' in :
for i in ['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', '$chrome_asyncScriptInfo', '$cdc_asdjflasutopfhvcZLmcfl_']:
('Remove %s from %s.' % (i, ))
= e('"%s"' % (i), '"NO-SUCH-ATTR"')
= e('ver', 'false')
= e('ChromeDriver', '')然后我们使⽤如下命令⾏启动脚本 -S my_然后通过selenium就可以正常访问⼀些屏蔽selenium的⽹站了4. pyppeteer它是⼀个基于的chrome官⽅框架,主要⽤于操作⾕歌⽆头模式进⾏各种操作,pyppeteer则是puppeteer的python版本。它的作⽤和selenium是类似的,通过脚本操作⽆头⾕歌,但是它并不会有selenium那么多的特征字符串,可以做到完全把“⾃⼰”当作真⼈操作。当然,它还是有缺点的.虽然puppeteer⼀直在更新,但是pyppeteer已经停⽌更新将近⼀年了,所以⽆法保证它以后是否可⽤。同样因为它是基于⾕歌⽆头的,因此它只能⽤于⾕歌⽆头,不想selenium⼀样,编写完脚本只需改变少量代码,便可以在多种浏览器中运⾏。下⾯是pyppeteer的官⽅⽂档:下⾯是⼀个简单的demoimport asynciofrom pyppeteer import launchasync def main(): browser = await launch() page = await e() await ('file:///C:/Users/Administrator/Desktop/') print(await t())_event_loop().run_until_complete(main())如果你电脑中没有chromium,执⾏这段代码后会⾃动帮你安装,然后再运⾏这段代码,但是⾮常慢,所以建议⾃⼰⽹上下载chromium后再执⾏脚本
发布者:admin,转转请注明出处:http://www.yc00.com/web/1687982635a63534.html
评论列表(0条)