我们经常会拿selenium进行自动登录来搭建cookie池,对于不想自己网站被爬的站主/开发人员来说,防止自动化脚本操作网站自然是反爬必须要做的工作。那么,他们究竟有哪些手段来检测用户是否是selenium呢?今天就来总结一下常见的识别selenium的方法以及各种解决之道。

目录

WebDriver识别

识别的原理

简单的js来反爬 selenium

WebDriver识别的绕过方法

其他的解决办法

使用火狐浏览器

给 webdriver 的 options增加参数

中间人代理mitmproxy

pyppeteer


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>

现在把这段代码保存到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 的识别依赖navigation.webdriver的返回值,那么我们在触发Javascript办法前将navigation.webdriver的返回值改为false或者undefind,问题就解决了。

script = 'Object.defineProperty(navigator,"webdriver",{get:() => false,});'

示例:

from selenium.webdriver import Chrome
import timebrower = Chrome(executable_path=r'D:\python\chromedriver_win32\chromedriver.exe')
url = 'http://www.porters.vip/features/webdriver.html'
brower.get(url)
script = 'Object.defineProperty(navigator,"webdriver",{get:() => false,});'#运行Javascript
brower.execute_script(script)#定位按钮并点击
brower.find_element_by_css_selector('.btn.btn-primary.btn-lg').click()#定位到文章内容元素
elements = brower.find_element_by_css_selector('#content')
time.sleep(1)
print(elements.text)
brower.close()

值得一提的是,淘宝的登录滑块验证页面也是用到了这个方法,使用selenium套件操作滑块后会出现“哎呀,出错了,点击刷新再来一次”这样的提示。

注意: 这种修改该属性值的办法只在当前页面有效,当浏览器打开新标签或新窗口时需要重新执行改变navigator.webdriver值的JavaScript代码。

其他的解决办法

使用火狐浏览器

很多时候selenium+谷歌打不开目标网站,都可以用火狐试试。

因为selenium只是一个控制浏览器的工具,而chromedriver和geckodriver都不是selenium官方发布的(鬼知道谁发布的),因此在控制浏览器方面会有不同的差异,具体原理不再赘述,总之很多网站不能用selenium+chrome就可以试试firefox。

(理论上IE也可能会达到相应效果,但IE内核实在太烂了,selenium+IE=龟速爬虫)

给 webdriver 的 options增加参数

谷歌浏览器的设置中有一个参数名为excludeSwitches,它的值是一个数组,向里面添加chrome的命令就可以在selenium打开chrome后自动执行数组内的指令,我们向里面添加一个enable-automation

from selenium import webdriver
from selenium.webdriver import ChromeOptionsoption = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
brower = webdriver.Chrome(options=option)
brower.get('file:///C:/Users/Administrator/Desktop/js.html')

此时运行这段代码,发现可以拿到正确的信息

中间人代理mitmproxy

mitmproxy其实和 fiddler/charles 等抓包工具的原理有些类似,作为一个第三方,它会把自己伪装成你的浏览器向服务器发起请求,服务器返回的response会经由它传递给你的浏览器,你可以通过编写脚本来更改这些数据的传递,从而实现对服务器的“欺骗”和对客户端的“欺骗”。

具体原理和使用见此

mitmproxy 参考文献:https://blog.wolfogre.com/posts/usage-of-mitmproxy/
下面提供一个防屏蔽selenium的简单demo

# my_demo.py
from mitmproxy import ctx  def response(flow):  # 'js'字符串为目标网站的相应js名 if 'js' in flow.request.url:  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_']:  ctx.log.info('Remove %s from %s.' % (i, flow.request.url))  flow.response.text = flow.response.text.replace('"%s"' % (i), '"NO-SUCH-ATTR"')  flow.response.text = flow.response.text.replace('t.webdriver', 'false')  flow.response.text = flow.response.text.replace('ChromeDriver', '')

然后我们使用如下命令行启动脚本

mitmdump.exe -S my_demo.py

然后通过selenium就可以正常访问一些屏蔽selenium的网站了

pyppeteer

它是一个基于node.js的chrome官方框架,主要用于操作谷歌无头模式进行各种操作,pyppeteer则是puppeteer的python版本。

它的作用和selenium是类似的,通过脚本操作无头谷歌,但是它并不会有selenium那么多的特征字符串,可以做到完全把“自己”当作真人操作。

当然,它还是有缺点的.虽然puppeteer一直在更新,但是pyppeteer已经停止更新将近一年了,所以无法保证它以后是否可用。同样因为它是基于谷歌无头的,因此它只能用于谷歌无头,不想selenium一样,编写完脚本只需改变少量代码,便可以在多种浏览器中运行。

下面是pyppeteer的官方文档:https://miyakogi.github.io/pyppeteer/
下面是一个简单的demo

import asyncio
from pyppeteer import launchasync def main():browser = await launch()page = await browser.newPage()await page.goto('file:///C:/Users/Administrator/Desktop/js.html')print(await page.content())asyncio.get_event_loop().run_until_complete(main())

如果你电脑中没有chromium,执行这段代码后会自动帮你安装,然后再运行这段代码,但是非常慢,所以建议自己网上下载chromium后再执行脚本

————————————————
版权声明:本文为CSDN博主「好逸爱劳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44685869/article/details/105602629

网站识别selenium爬虫的原理以及解决方法相关推荐

  1. WebDriver 识别反爬虫的原理和破解方法~

    作者|志斌 来源|python笔记 有时候我们在爬取动态网页的时候,会借助渲染工具来进行爬取,这个"借助"实际上就是通过使用相应的浏览器驱动(即WebDriver)向浏览器发出命令 ...

  2. ARP***原理及解决方法与CMD命令分类(1)

    ARP***原理及解决方法与CMD命令分类 ARP***原理及解决方法与CMD命令 [故障原因] 局域网内有人使用ARP欺骗的***程序(比如:传奇盗号的软件,某些传奇外挂中也被恶意加载了此程序). ...

  3. Tomcat中文乱码问题的原理和解决方法

    为什么80%的码农都做不了架构师?>>>    Tomcat中文乱码问题的原理和解决方法 自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决 ...

  4. 安卓 图像清晰度识别_智能车牌识别系统的常见故障和解决方法

    车牌号是车辆的唯一身份标志,它的特殊性与重要性从而决定了车牌识别系统在智慧城市交通管理系统中成为不可或缺的重要组成部分.下面智能车牌识别系统厂家畅荧智能科技将详细为您介绍一些智能车牌识别系统常见的故障 ...

  5. 关于如何取消访问https时的提示:“此网站的安全证书存在问题”的解决方法

    关于如何取消访问https时的提示:"此网站的安全证书存在问题"的解决方法 参考文章: (1)关于如何取消访问https时的提示:"此网站的安全证书存在问题"的 ...

  6. 一个Https网站发送Http的 ajax请求的解决方法

    一个Https网站发送Http的 ajax请求的解决方法 参考文章: (1)一个Https网站发送Http的 ajax请求的解决方法 (2)https://www.cnblogs.com/yuming ...

  7. 网站被劫持怎么办?传奇网站打开跳到其他站的解决方法

    网站劫持一直是工信部着重打击的,刚开始流量劫持行为还没有被定义为刑事犯罪,不少人把它当做一种快速牟利的手段.2015年流量劫持首次被认定为犯罪,上海浦东新区人民法院判决了全国首起流量劫持刑事案件,两名 ...

  8. 网站是否被墙的辨别及解决方法

    网站是否被墙的辨别及解决方法 什么是网站被墙 "网站被墙"一般是因为国内防火墙(GFW)屏蔽了网站域名.广义上讲是指网站的域名或IP地址由于某些原因被屏蔽,使得网站在部分地区无法访 ...

  9. 群晖moments套件识别拍摄日期为1970错误的解决方法

    moments套件很好用.之前自己的手机用DS_FILE同步到服务器的相册里,然后用MOMENTS打开共享相册来查看图片,体验拉爆.但是在同步媳妇儿的手机时,发现时间线里同步的几千张照片全部塞到了19 ...

最新文章

  1. linux 里常用的几个查找命令
  2. 【网络】HTTP2.0新特性
  3. ViewBag对象的更改
  4. Mathematica 8 的激活方法 (转载)
  5. 【哲学】不可知论是什么?agnosticism
  6. wfs方式获取最短路径
  7. MAC OS安装Composer + Laravel
  8. 怎么一秒钟给微信头像戴上圣诞帽,我教你啊
  9. 【codecombat】 试玩全攻略 第十六关 近战
  10. VC开发数据库基础之ADO篇
  11. C语言情人节浪漫烟花表白代码
  12. keil5安装教程及下载
  13. Django项目实战——12—(Docker和FastDFS上传和下载文件、浏览器下载并渲染图片(nginx)、录入商品数据和图片数据、首页广告)
  14. 实战讲解网关接口统一认证SpringCloudGateway(图+文)
  15. dejavu项目笔记
  16. Win10设置虚拟机桥接连接
  17. 115道Java面试题及答案分享,java程序员赶紧收好
  18. 为云原生而生 DeepFlow破解混合云时代网络监控难题
  19. 【开发技术】2万字分析shiro、spring security两大安全框架,spring session,OAuth2 入门级教程
  20. 数据预处理--缺失值填补《菜菜学习笔记》

热门文章

  1. 【Excel高效工作3】VLOOKUP函数实例使用(二):精确匹配进阶——反向查找,多条件查找 / 模糊匹配的使用
  2. MATLAB—取整函数汇总(fix、ceil、floor、round的用法与区别 )
  3. Notepad++快捷键(快速选中一行等)
  4. oracle9i主目录,Oracle 9i 目录的说明
  5. deepin系统入坑记录
  6. OpenGLES2.0着色器语言glsl
  7. Git版本控制从头到尾【详细】
  8. js验证姓名和身份证号
  9. ORA-00911错误
  10. AI 合成数字化身?从根本上改变视频创作的过程! #Synthesia