webdriver break

本文介绍一种基于mitmproxy代理和自定义脚本的方法,用于隐藏Selenium WebDriver特征,从而绕过网站的反爬虫策略。通过修改浏览器标识,使WebDriver驱动的浏览器能够顺利登录目标网站。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可能是全网唯一一个基于windows和java的关于selenium webDriver绕过网站反爬服务的方法

2018年12月21日 14:28:55 oldmee 阅读数:1445

版权声明:本文虽为博主原创文章,但你转了博主也不知道,所以放心的转吧。 https://blog.youkuaiyun.com/javaer_lee/article/details/85160659

事情的起因是我需要用selenium的webDriver技术实现一些简单操作,一直用的是chrome和配套的webDriver(chrome的强大和轻量化真的是无敌的),但是突然有一天发现有些网站我用webDriver启动的浏览器是怎么也登录不进去(本来是用自动化登录的,现在人工登录都不行),于是开始在google上找答案,发现chrome和firfox默认的驱动都会被反爬服务识别出来:

 
  1. webdriver.chrome.driver

  2. 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

 
  1. from mitmproxy import ctx

  2. injected_javascript = '''

  3. // overwrite the `languages` property to use a custom getter

  4. Object.defineProperty(navigator, "languages", {

  5. get: function() {

  6. return ["zh-CN","zh","zh-TW","en-US","en"];

  7. }

  8. });

  9.  
  10. // Overwrite the `plugins` property to use a custom getter.

  11. Object.defineProperty(navigator, 'plugins', {

  12. get: () => [1, 2, 3, 4, 5],

  13. });

  14.  
  15. // Pass the Webdriver test

  16. Object.defineProperty(navigator, 'webdriver', {

  17. get: () => false,

  18. });

  19.  
  20.  
  21. // Pass the Chrome Test.

  22. // We can mock this in as much depth as we need for the test.

  23. window.navigator.chrome = {

  24. runtime: {},

  25. // etc.

  26. };

  27.  
  28. // Pass the Permissions Test.

  29. const originalQuery = window.navigator.permissions.query;

  30. window.navigator.permissions.query = (parameters) => (

  31. parameters.name === 'notifications' ?

  32. Promise.resolve({ state: Notification.permission }) :

  33. originalQuery(parameters)

  34. );

  35. '''

  36.  
  37. def response(flow):

  38. # Only process 200 responses of HTML content.

  39. if not flow.response.status_code == 200:

  40. return

  41.  
  42. # Inject a script tag containing the JavaScript.

  43. html = flow.response.text

  44. html = html.replace('<head>', '<head><script>%s</script>' % injected_javascript)

  45. flow.response.text = str(html)

  46. ctx.log.info('>>>> js代码插入成功 <<<<')

  47.  
  48. # 只要url链接以target开头,则将网页内容替换为目前网址

  49. # target = 'https://target-url.com'

  50. # if flow.url.startswith(target):

  51. # flow.response.text = flow.url

 

把脚本文件放在mitmproxy的bin目录下:

 在当前目录起一个cmd,启动mitmdump并注入脚本:

 
  1. C:\user>mitmdump -s indject_js_proxy.py

  2.  
  3. Loading script indject_js_proxy.py

  4. Proxy server listening at http://*:8080

 启动成功mitmproxy会监听8080端口,下面只需要在代码中加入代理即可。

 

第三步,在selenium的webDriver中加入代理(Java版本):

 

 
  1. System.setProperty("webdriver.chrome.driver","C:\\Users\\sh3\\AppData\\Local\\Google\\Chrome\\Application\\chromeDriver.exe");

  2.  
  3. ChromeOptions options = new ChromeOptions();

  4. options.addArguments("--proxy-server=127.0.0.1:8080");

  5.  
  6. ChromeDriver driver = new ChromeDriver(options);

再次启动你的webDriber,在控制台下输入navigator.webdriver并回车,如果显示false,说明你已经成功了

 

还有一个测试网站:https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html

如果webDriver是绿色,也说明代理起作用了:

转自:https://blog.youkuaiyun.com/javaer_lee/article/details/85160659

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值