详解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实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
Python写的服务监控程序实例
Jan 31 Python
Python获取运行目录与当前脚本目录的方法
Jun 01 Python
在Django框架中编写Contact表单的教程
Jul 17 Python
python 中的int()函数怎么用
Oct 17 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
Jun 20 Python
Python实现插入排序和选择排序的方法
May 12 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
django创建简单的页面响应实例教程
Sep 06 Python
python 获取计算机的网卡信息
Feb 18 Python
Python如何使用logging为Flask增加logid
Mar 30 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自动更新新闻DIY
2006/10/09 PHP
jquery 元素相对定位代码
2010/10/15 Javascript
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
js获取地址栏中传递的参数(两种方法)
2017/02/08 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
vue 中url 链接左边的小图标更改问题
2019/12/30 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
python实现日常记账本小程序
2018/03/10 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
python实现键盘控制鼠标移动
2020/11/27 Python
python内存动态分配过程详解
2019/07/15 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
详解python 内存优化
2020/08/17 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
html5.2 dialog简介详解
2018/02/27 HTML / CSS
护士长竞聘演讲稿
2014/04/30 职场文书
开学典礼演讲稿
2014/05/23 职场文书
结对共建协议书
2014/08/20 职场文书
工作简报格式范文
2015/07/21 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
Redis可视化客户端小结
2021/06/10 Redis