详解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编程生成随机用户名及密码的方法示例
May 05 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
python爬虫获取多页天涯帖子
Feb 23 Python
django rest framework 数据的查找、过滤、排序的示例
Jun 25 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
Python面向对象进阶学习
May 21 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
python实现对变位词的判断方法
Apr 05 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 Python
python用分数表示矩阵的方法实例
Jan 11 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程序效率优化的一些策略小结
2010/07/17 PHP
php数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
PHP中使用CURL获取页面title例子
2015/01/07 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
基于jquery的cookie的用法
2011/01/10 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
JS求平均值的小例子
2013/11/29 Javascript
JS判断两个时间大小的示例代码
2014/01/28 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
js获取域名的方法
2015/01/27 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
关于JS解构的5种有趣用法
2019/09/05 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
spyder常用快捷键(分享)
2017/07/19 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
python实现定时发送邮件到指定邮箱
2020/12/23 Python
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
MATCHESFASHION.COM美国官网:英国奢侈品零售商
2018/10/29 全球购物
转预备党员政审材料
2014/02/06 职场文书
初三学生评语大全
2014/04/24 职场文书
管理工程专业求职信
2014/08/10 职场文书
2014年效能监察工作总结
2014/11/21 职场文书