可能是全网唯一一个基于windows和java的关于selenium webDriver绕过网站反爬服务的方法
事情的起因是我需要用selenium的webDriver技术实现一些简单操作,一直用的是chrome和配套的webDriver(chrome的强大和轻量化真的是无敌的),但是突然有一天发现有些网站我用webDriver启动的浏览器是怎么也登录不进去(本来是用自动化登录的,现在人工登录都不行),于是开始在google上找答案,发现chrome和firfox默认的驱动都会被反爬服务识别出来:
webdriver.chrome.driver
webdriver.firefox.bin
IE就算了,调试查看标签的时候简直没法用,我就突然想到firefox不是还有一个驱动么,是三方的驱动:
webdriver.gecko.driver
那我用这个驱动试试会不会触发反爬吧,结果跟我预想的一样,可以登录,没有触发反爬机制,我那个高兴啊,高兴的劲儿还没持续多久,又碰到一个问题,之前用selenium里面的Actions类可以实现移动鼠标,拖拽,释放等动作,但是我用decko驱动的话就会报错,怎么办呢,接着查google呗,这个真的查了好一阵,发现了这个回复:
GeckoDrive不支持Actions,这下心可就凉了,绕了一圈,好不容易发现一条路,走了一段,发现是条死路。最后找到了一个关键字,爬虫和反爬虫,根据这个思路,用chromeDriver越过了爬虫机制,下面是实现方法。
现在绝大部分网站的反爬策略中都加入了webdriver检测,如果检测到了webdriver则无论如何也不让你过去,还有一种更绝,直接把你的ip封掉,你会发现你正常操作也无法访问网站了。
方法思路:基于mitmproxy代理,把请求中的webdriver隐藏掉即可。
第一步,你得装个mitmproxy,除了最新版,稍微老一点的版本有exe的安装文件,下载后直接安装即可,安装完后在安装目录的bin目录下有两个exe文件,mitmdump.exe和mitmweb.exe,这里我们主要使用mitmdump.exe
第二步,我们需要写一个隐藏webdriver字段的脚本,脚本文件用python编写(我的python版本是3.7.1貌似3.6也可以),脚本如下(感谢大神提供的脚本:https://zhuanlan.zhihu.com/p/43581988):
indject_js_proxy.py
from mitmproxy import ctx
injected_javascript = '''
// overwrite the `languages` property to use a custom getter
Object.defineProperty(navigator, "languages", {get: function() {return ["zh-CN","zh","zh-TW","en-US","en"];}
});// Overwrite the `plugins` property to use a custom getter.
Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3, 4, 5],
});// Pass the Webdriver test
Object.defineProperty(navigator, 'webdriver', {get: () => false,
});// Pass the Chrome Test.
// We can mock this in as much depth as we need for the test.
window.navigator.chrome = {runtime: {},// etc.
};// Pass the Permissions Test.
const originalQuery = window.navigator.permissions.query;
window.navigator.permissions.query = (parameters) => (parameters.name === 'notifications' ?Promise.resolve({ state: Notification.permission }) :originalQuery(parameters)
);
'''def response(flow):# Only process 200 responses of HTML content.if not flow.response.status_code == 200:return# Inject a script tag containing the JavaScript.html = flow.response.texthtml = html.replace('<head>', '<head><script>%s</script>' % injected_javascript)flow.response.text = str(html)ctx.log.info('>>>> js代码插入成功 <<<<')# 只要url链接以target开头,则将网页内容替换为目前网址# target = 'https://target-url.com'# if flow.url.startswith(target):# flow.response.text = flow.url
把脚本文件放在mitmproxy的bin目录下:
在当前目录起一个cmd,启动mitmdump并注入脚本:
C:\user>mitmdump -s indject_js_proxy.py Loading script indject_js_proxy.py
Proxy server listening at http://*:8080
启动成功mitmproxy会监听8080端口,下面只需要在代码中加入代理即可。
第三步,在selenium的webDriver中加入代理(Java版本):
System.setProperty("webdriver.chrome.driver","C:\\Users\\sh3\\AppData\\Local\\Google\\Chrome\\Application\\chromeDriver.exe");ChromeOptions options = new ChromeOptions();
options.addArguments("--proxy-server=127.0.0.1:8080");ChromeDriver driver = new ChromeDriver(options);
再次启动你的webDriber,在控制台下输入navigator.webdriver并回车,如果显示false,说明你已经成功了
还有一个测试网站:https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html
如果webDriver是绿色,也说明代理起作用了:
可能是全网唯一一个基于windows和java的关于selenium webDriver绕过网站反爬服务的方法相关推荐
- 云效(原RDC)如何构建一个基于Maven的Java项目
最近在将公司的持续集成架构做一个系统的调整,调整过程中受到了RDC团队大量的帮助,所以利用国庆时间写了几篇RDC的分享,希望能让更多的人了解和用好RDC这个产品. 我会把我最近3个月的使用体会分成5个 ...
- 一个基于 SpringBoot 开源的小说和漫画在线阅读网站,简洁大方 !强烈推荐 !
来源:GitHub精选 今天给大家推荐的这个开源项目是一个基于 SpringBoot 实现的小说和漫画在线阅读网站. 这个开源项目叫:fiction_house. 这个开源项目是一个多平台(web.安 ...
- 一个基于 SpringBoot 开源的小说和漫画在线阅读网站,简洁大方、强烈推荐
来源:GitHub精选 今天给大家推荐的这个开源项目是一个基于 SpringBoot 实现的小说和漫画在线阅读网站. 这个开源项目叫:fiction_house. 这个开源项目是一个多平台(web.安 ...
- 推荐一个基于 SpringBoot 开源的小说和漫画在线阅读网站
今天给大家推荐的这个开源项目是一个基于 SpringBoot 实现的小说和漫画在线阅读网站. 这个开源项目叫:fiction_house. 这个开源项目是一个多平台(web.安卓 app.微信小程序) ...
- eclipse你的主机中的软件中止了一个已建立的连接。_如何备份/恢复一个基于Windows系统的操作面板?...
说明: 对于基于 Windows 系统面板有两种组态备份的选项,而不必获得 ProTool 或 WinCC flexible 的原程序: A. 使用 ProSave 备份/恢复 B. 使用存储卡备份/ ...
- libsvm java下载_一个基于LIBSVM(JAVA)的股票预测demo
[实例简介] 一个基于LIBSVM的股票价格预测程序,采用随机森林算法对样本进行训练和预测,使用的编程语言为JAVA. [实例截图] [核心代码] stock-master └── stock-mas ...
- windows开启nfs_nfs启动不了怎么办_电脑开启nfs服务的方法
2019-12-10 10:36:42 使用win7系统时经常都会使用到nfs服务,nfs服务是什么?nfs服务是用来网络上的共享存储,用户都不清楚怎么开启这个服务,所以今天笔者给大家带来一招轻松开始 ...
- 全网唯一一个可以复现成功的光流计算项目
https://download.csdn.net/download/weixin_32759777/13701406
- 设计一个基于flask的高并发高可用的查询ip的http服务
结构设计 基础架构为flask+gunicorn+负载均衡,负载均衡分为阿里云硬件负载均衡服务和软负载nginx.gunicorn使用supervisor进行管理. 使用nginx软件负载结构图 使用 ...
最新文章
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针...
- python使用方法-Python中bisect的使用方法
- 一个普通ERROR 1135 (HY000)错误引发的血案:
- 涂国旗(洛谷P3392题题解,Java语言描述)
- ffmpeg播放器 android,Android使用FFmpeg(六)--ffmpeg实现音视频同步播放
- 单片机c语言三种经典程序结构,单片机C语言程序的结构和设计精选.docx
- linux虚拟机lvm扩容,LVM扩容-----给虚拟机添加空间
- 关于sqlite多线程
- matplotlib画的图保存为emf格式
- tf.ones_like()函数用法详解(附代码理解)
- 不小心执行了rm -f,如何恢复?
- HTML5实现点击触发灯泡开关
- Android利用谷歌地图获取并解析经纬度对应的地理位置
- matlab小数分数互换
- 软测—直播教学 黑盒测试
- Lighttools 闪光灯仿真自建实例
- 【分治算法】大整数乘法
- unity脚本学习3
- 语音朗读html的源码,详解在网页上通过JS实现文本的语音朗读
- UE风格化Day18-UE强制删除错了/UE预览关卡显示/风格化水材质