详解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基础教程之lambda表达式使用方法
Feb 12 Python
跟老齐学Python之关于循环的小伎俩
Oct 02 Python
python清除字符串里非字母字符的方法
Jul 02 Python
python监控键盘输入实例代码
Feb 09 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
Python jieba库用法及实例解析
Nov 04 Python
tensorflow 只恢复部分模型参数的实例
Jan 06 Python
python读取tif图片时保留其16bit的编码格式实例
Jan 13 Python
Python3.7 读取音频根据文件名生成脚本的代码
Apr 07 Python
python新手学习使用库
Jun 11 Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 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 DataGrid 实现代码
2009/08/12 PHP
php操作excel文件 基于phpexcel
2010/07/02 PHP
关于PHP session 存储方式的详细介绍
2013/06/25 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
详解webpack编译多页面vue项目的配置问题
2017/12/11 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
微信小程序 高德地图路线规划实现过程详解
2019/08/05 Javascript
JS如何实现封装列表右滑动删除收藏按钮
2020/07/23 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
python处理csv数据的方法
2015/03/11 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
临时用工协议书范本
2014/10/29 职场文书
单位租车协议书
2015/01/29 职场文书
法制工作总结2015
2015/07/23 职场文书
2015元旦感言
2015/12/09 职场文书