之前爬美团外卖后台的时候出现的问题,各种方式拖动验证码都无法成功,包括直接控制拉动,模拟人工轨迹的随机拖动都失败了,最后发现只要用chrome driver打开页面,哪怕手动登录也
之前爬美团外卖后台的时候出现的问题,各种方式拖动验证码都无法成功,包括直接控制拉动,模拟人工轨迹的随机拖动都失败了,最后发现只要用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 反爬虫内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!