详解Selenium-webdriver绕开反爬虫机制的4种方法


Posted in Python onOctober 28, 2020

之前爬美团外卖后台的时候出现的问题,各种方式拖动验证码都无法成功,包括直接控制拉动,模拟人工轨迹的随机拖动都失败了,最后发现只要用chrome driver打开页面,哪怕手动登录也不可以,猜测driver肯定是直接被识别出来了。一开始尝试了改user agent等方式,仍然不行,由于其他项目就搁置了。今天爬淘宝生意参谋又出现这个问题,经百度才知道原来chrome driver的变量有一个特征码,网站可以直接根据特征码判断,经百度发现有4种方法可以解决,记录一下自己做的尝试。

1、mitproxy拦截请求 √

本质上就是在响应中利用mitproxy将包含的webdriver的JS中的关键字替换成其他的字符
1.给本机设置代理ip 127.0.0.1端口8001(为了让所有流量走mitmproxy)具体方法请百度。
2.启动mitmproxy。

windows:

mitmdump -p 8001

3.打开chrome的开发者工具,查各个.js文件,是否存在driver字样,最终找到需要的.js文件。

4.干扰脚本

def response(flow): 
  if '/js/yoda.' in flow.request.url:
  for webdriver_key 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 "{}" from {}.'.format(
   webdriver_key, flow.request.url
   )) 
  flow.response.text = flow.response.text.replace('"{}"'.format(webdriver_key), '"NO-SUCH-ATTR"') 
 flow.response.text = flow.response.text.replace('t.webdriver', 'false')
 flow.response.text = flow.response.text.replace('ChromeDriver', '')

5.退出刚才的mitmproxy状态,重新用命令行启动mitmproxy干扰脚本 监听8001端口的请求与响应。

mitmdump -s DriverPass.py -p 8001

2、修改源码 ×

修改js/call_function.js,129行。

var doc = opt_doc || document;
 var key = '$cdc_asdjflasutopfhvcZLmcfl_';
 if (!(key in doc))
 doc[key] = new Cache();
 return doc[key];
}

?>修改后

function getPageCache(opt_doc) {
 var doc = opt_doc || document;
 var key = ‘$bobo_zhangyx_';
if (!(key in doc))
 doc[key] = new Cache();
 return doc[key];
 }

经测试似乎已失效,可能由于版本迭代问题。

3、手动打开跑程序√

cmd 运行命令

chrome.exe --remote-debugging-port=9222

打开一个浏览器,然后py代码里

chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

4、换V63之前的chrome与driver

(似乎也是个好方法但是没有尝试)

到此这篇关于详解Selenium-webdriver绕开反爬虫机制的4种方法的文章就介绍到这了,更多相关Selenium webdriver 反爬虫内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python支持断点续传的多线程下载示例
Jan 16 Python
python实现字符串连接的三种方法及其效率、适用场景详解
Jan 13 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
python绘制简单彩虹图
Nov 19 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
Python 中Django验证码功能的实现代码
Jun 20 Python
pyqt5与matplotlib的完美结合实例
Jun 21 Python
pandas数据处理之绘图的实现
Jun 15 Python
python实现三壶谜题的示例详解
Nov 02 Python
Python 线程池模块之多线程操作代码
May 20 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 Python
详解Python流程控制语句
Oct 28 #Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 #Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
Nov 25 #Python
Python字典实现伪切片功能
Oct 28 #Python
python使用selenium爬虫知乎的方法示例
Oct 28 #Python
怎么解决pycharm license Acti的方法
Oct 28 #Python
python如何快速拼接字符串
Oct 28 #Python
You might like
PHP之数组学习
2011/05/29 PHP
允许phpmyadmin空密码登录的配置方法
2011/05/29 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
让JavaScript 轻松支持函数重载 (Part 1 - 设计)
2009/08/04 Javascript
JavaScript 解析Json字符串的性能比较分析代码
2009/12/16 Javascript
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
js实现数组转换成json
2015/06/26 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
详谈javascript精度问题与调整
2017/07/08 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
jQuery实现简易QQ聊天框
2020/02/10 jQuery
Javascript查看大图功能代码实现
2020/05/07 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
Python进程间通信Queue实例解析
2018/01/25 Python
Django自定义manage命令实例代码
2018/02/11 Python
Python 脚本拉取 Docker 镜像问题
2019/11/10 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
Python logging模块原理解析及应用
2020/08/13 Python
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
初中三年学生的学习自我评价
2013/11/13 职场文书
施工班组长岗位职责
2014/01/05 职场文书
高二英语教学反思
2014/01/19 职场文书
社区母亲节活动方案
2014/03/05 职场文书
工伤事故处理协议书怎么写
2014/10/15 职场文书