Selenium+Webdriver被检测识别出来的应对方案
在写爬虫,面对很多js 加载的页面,很多人束手无策,更多的人喜欢用Senlenium+ Webdriver,古语有云:道高一尺魔高一丈。已淘宝为首,众多网站都针对 Selenium的js监测机制, 比如:window.navigator.webdriver,navigator.languages,navigator.plugins.length……
正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为
undefined。
当我们用selenium 的时候, window.navigator.webdriver的值为 true。
那么如何解决这个问题呢?
第一种:使用mitmproxy用中间人的方式截取服务器发送来的js,修改js里面函数的参值方式发送给服务器。相当于在browser和server之间做一层中介的拦截。不过此方法要对js非常熟悉的人才好实施。
第二种方法依旧通过selenium,不过是在服务器在第一次发送js并在本地验证的时候,做好‘第一次’的伪装,从而实现‘第一次登陆’有效。。方法简单,适合小白。
之前我写过一次用 pyppeteer 加 asyncio 绕过selenium检测的方案,对于新手来说比较麻烦,现在我有了更好的解决方案。
只需要设置Chromedriver的启动参数即可解决问题。
在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches
,它的值为['enable-automation']
,完整代码如下:
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)
此时启动的Chrome窗口,在右上角会弹出一个提示,不用管它,不要点击停用
按钮。
再次在开发者工具的Console选项卡中查询window.navigator.webdriver
,可以发现这个值已经自动变成undefined
了。并且无论你打开新的网页,开启新的窗口还是点击链接进入其他页面,都不会让它变成true
。
只支持旧的版本啦,更多信息以及其它方法戳
最新文章
- AudioRecord类获取录音音量分贝数
- python csv用法
- -[UIViewController _loadViewFromNibNamed:bundle:]
- Linux下怎么查看当前系统的版本
- CSS Reset样式重置
- Android源码分析之MessageQueue
- PHPExcel上传sae遇到: -1:fail to get xml content
- Windows下查看8080进程及结束进程命令
- try catch语句在VC下的处理
- Java 类成员的初始化顺序
- 左侧高亮(js)
- 前端学习笔记(zepto或jquery)——对li标签的相关操作(五)
- 批处理数据--db2备份数据
- chrome开发工具指南(十一)
- 第1阶段——uboot分析之硬件初始化start_armboot函数(5)
- [二十六]JavaIO之再回首恍然(如梦? 大悟?)
- 【转】Spark实现行列转换pivot和unpivot
- jmeter 报错Error in NonGUIDriver java.lang.IllegalArgumentException: Report generation requires csv output format, check 'jmeter.save.saveservice.output_format' property
- 周一要做的事情Sd31y5YE
- Go语言的map如何判断key是否存在