详解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中使用PyQt把网页转换成PDF操作代码实例
Apr 23 Python
有趣的python小程序分享
Dec 05 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
详解Python循环作用域与闭包
Mar 21 Python
使用python爬取抖音视频列表信息
Jul 15 Python
python 3.6.7实现端口扫描器
Sep 04 Python
Python常用数据类型之间的转换总结
Sep 06 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
Oct 06 Python
Python Collatz序列实现过程解析
Oct 12 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
如何利用Python 进行边缘检测
Oct 14 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 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实现的随机广告显示代码
2007/06/14 PHP
php程序效率优化的一些策略小结
2010/07/17 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
了解JavaScript中let语句
2019/05/30 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
Move Free官方海外旗舰店:美国骨关节健康专业品牌
2017/12/06 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
国际象棋商店:The Chess Store
2018/07/09 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
软件工程师面试题
2012/06/25 面试题
《蚕姑娘》教学反思
2014/04/15 职场文书
学习礼仪心得体会
2014/09/01 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android