事情的起因是我需要用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绕过网站反爬服务的方法相关推荐

  1. 云效(原RDC)如何构建一个基于Maven的Java项目

    最近在将公司的持续集成架构做一个系统的调整,调整过程中受到了RDC团队大量的帮助,所以利用国庆时间写了几篇RDC的分享,希望能让更多的人了解和用好RDC这个产品. 我会把我最近3个月的使用体会分成5个 ...

  2. 一个基于 SpringBoot 开源的小说和漫画在线阅读网站,简洁大方 !强烈推荐 !

    来源:GitHub精选 今天给大家推荐的这个开源项目是一个基于 SpringBoot 实现的小说和漫画在线阅读网站. 这个开源项目叫:fiction_house. 这个开源项目是一个多平台(web.安 ...

  3. 一个基于 SpringBoot 开源的小说和漫画在线阅读网站,简洁大方、强烈推荐

    来源:GitHub精选 今天给大家推荐的这个开源项目是一个基于 SpringBoot 实现的小说和漫画在线阅读网站. 这个开源项目叫:fiction_house. 这个开源项目是一个多平台(web.安 ...

  4. 推荐一个基于 SpringBoot 开源的小说和漫画在线阅读网站

    今天给大家推荐的这个开源项目是一个基于 SpringBoot 实现的小说和漫画在线阅读网站. 这个开源项目叫:fiction_house. 这个开源项目是一个多平台(web.安卓 app.微信小程序) ...

  5. eclipse你的主机中的软件中止了一个已建立的连接。_如何备份/恢复一个基于Windows系统的操作面板?...

    说明: 对于基于 Windows 系统面板有两种组态备份的选项,而不必获得 ProTool 或 WinCC flexible 的原程序: A. 使用 ProSave 备份/恢复 B. 使用存储卡备份/ ...

  6. libsvm java下载_一个基于LIBSVM(JAVA)的股票预测demo

    [实例简介] 一个基于LIBSVM的股票价格预测程序,采用随机森林算法对样本进行训练和预测,使用的编程语言为JAVA. [实例截图] [核心代码] stock-master └── stock-mas ...

  7. windows开启nfs_nfs启动不了怎么办_电脑开启nfs服务的方法

    2019-12-10 10:36:42 使用win7系统时经常都会使用到nfs服务,nfs服务是什么?nfs服务是用来网络上的共享存储,用户都不清楚怎么开启这个服务,所以今天笔者给大家带来一招轻松开始 ...

  8. 全网唯一一个可以复现成功的光流计算项目

    https://download.csdn.net/download/weixin_32759777/13701406

  9. 设计一个基于flask的高并发高可用的查询ip的http服务

    结构设计 基础架构为flask+gunicorn+负载均衡,负载均衡分为阿里云硬件负载均衡服务和软负载nginx.gunicorn使用supervisor进行管理. 使用nginx软件负载结构图 使用 ...

最新文章

  1. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针...
  2. python使用方法-Python中bisect的使用方法
  3. 一个普通ERROR 1135 (HY000)错误引发的血案:
  4. 涂国旗(洛谷P3392题题解,Java语言描述)
  5. ffmpeg播放器 android,Android使用FFmpeg(六)--ffmpeg实现音视频同步播放
  6. 单片机c语言三种经典程序结构,单片机C语言程序的结构和设计精选.docx
  7. linux虚拟机lvm扩容,LVM扩容-----给虚拟机添加空间
  8. 关于sqlite多线程
  9. matplotlib画的图保存为emf格式
  10. tf.ones_like()函数用法详解(附代码理解)
  11. 不小心执行了rm -f,如何恢复?
  12. HTML5实现点击触发灯泡开关
  13. Android利用谷歌地图获取并解析经纬度对应的地理位置
  14. matlab小数分数互换
  15. 软测—直播教学 黑盒测试
  16. Lighttools 闪光灯仿真自建实例
  17. 【分治算法】大整数乘法
  18. unity脚本学习3
  19. 语音朗读html的源码,详解在网页上通过JS实现文本的语音朗读
  20. UE风格化Day18-UE强制删除错了/UE预览关卡显示/风格化水材质

热门文章

  1. 基于turtlebot3实现SLAM建图及自主导航仿真
  2. 如何搭建一个自己的网站-域名篇(上)
  3. 【小米5】MIUI 9 MIUI 10 官方ROM历史刷机包汇总
  4. EF Core 迁移过程遇到EF Core tools version版本不相符的解决方案
  5. Qt主窗囗类QMainwindow学习
  6. FactorVAE:基于变分自编码器的动态因子模型
  7. Python 获取EXSI宿主机上虚拟机数据
  8. 第五章.MyBatis高级映射
  9. Python实战-折线图生成
  10. 《人性的弱点》总结之一 --- 人际交往的基本技巧