[爬虫] 验证码
所有验证码测试:http://dun.163.com/trial/sms
字母验证码
包源码:https://github.com/justamanm/files/blob/master/yundama.py
from login.weibo.yundama import indetifyret = indetify(image_data) # image_data为图片的二进制数据,返回验证码字符串
TODO:做图像识别也可以
生成图片验证码
包源码:https://github.com/justamanm/tool_files/tree/master/captcha
from info.utils.captcha.captcha import captcha# name-验证码标识,text-字符串内容,image-图片二进制数据name, text, image = captcha.generate_captcha()
反爬:识别出selenium-webdriver
参考:https://zhuanlan.zhihu.com/p/43581988
1.使window.navigator.webdriver为undefined
可以修改js文件,也可以设置options
2.使用修改过的webdriver
淘宝案例:修改js,在登录页js(121.js)添加以下代码,在fiddler中替换响应js即可
Object.defineProperties(navigator,{
webdriver:{
get:() =>false
}
})
站酷案例:设置options为开发者模式 + 修改了的webdriver
(https://passport.zcool.com.cn/regPhone.do?appId=1006&cback=https://my.zcool.com.cn/focus/activity)
原因:chromeDriver会创建cdc_asdjflasutopfhvcZLmcfl_元素用于各种操作。比如在使用findElement方法时会使用该元素
解决:使用修改后的webdriver(下载:https://github.com/justamanm/tool_files/blob/master/webdriver/chromedriver%E4%B8%8D%E5%B8%A6%E7%89%B9%E5%BE%81.exe)
options
options = webdriver.ChromeOptions()
# 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium
options.add_experimental_option('excludeSwitches', ['enable-automation'])
self.browser = webdriver.Chrome("C:\\Users\\Mr.V\\Desktop\\chromedriver.exe",options=options)
其他:
webdriver测试网站:https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html
(不过不是很准确,有时虽然检测非webdriver,但还是被识别)
滑动验证码-仅滑动(极验第一代?)
1.上面站酷案例
2.高德地图登录案例,与站酷一模一样
参考:https://www.jb51.net/article/159533.htm
滑动验证码-图片滑动(极验第二代)
思路:selenium获取滑块图片,借助opencv识别缺口位置
项目地址:https://github.com/justamanm/tool_files/tree/master/%E6%BB%91%E5%8A%A8%E9%AA%8C%E8%AF%81%E7%A0%81
最后,本例中,生成轨迹的间隔时间t = 0.4,DEFAULT_MOVE_DURATION = 45,distance=y+1,成功率在70%左右
注:
间隔时间不同轨迹不同,会导致总位移改变,需要手动调试提高成功率
# y+5为边框位置,-9为减去初始滑块位置的长度,+8为手动调整值;不能太准确,否则验证失败;超过一些准确率高
distance = y + 5 - 9 + 5
总结:
1.调整t,控制轨迹,最好有加速效果而不是均速;t变了后需要微调控制总位移
2.调DEFAULT_MOVE_DURATION,调整移动速度
3.微调总位移distance
解决的问题:滑动时不流畅
是由于源码中,每次滑动的时间设置太长导致的,更改selenium包源码中的DEFAULT_MOVE_DURATION(seleniuim/webdriver/common/actions/pointer_input.py),更改到50即可
参考:https://blog.csdn.net/qq_36250766/article/details/100541705
还存在的问题:位置识别错误,轨迹问题(现在是调整源码中默认移动速度和轨迹间隔时间),未成功的几种情况及应对,代码其他地方抛出异常的处理(如ActionChains第二次click_and_hold时抛出异常,不能定位滑块位置),
图像识别参考:https://blog.csdn.net/u012067766/article/details/80500493
其他:http://www.xjishu.com/zhuanli/55/201810050045.html
极验第三代-思路
基本:按照顺序依次点击给定的文字
获取给定的文字,依次做图像识别,获取位置,点击
更复杂点的:需要额外识别出给定图片中的文字,而且大图中的有其他的很多文字
https://passport.ctrip.com/user/login?fnew=2
升级:按语义依次点击图片中的文字
识别出图片中的文字,语义分析或在成语库中匹配,排序,依次点击