[爬虫] 验证码

所有验证码测试:http://dun.163.com/trial/sms

 

字母验证码

包源码:https://github.com/justamanm/files/blob/master/yundama.py

from login.weibo.yundama import indetify
ret = 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

参考:https://stackoverflow.com/questions/33225947/can-a-website-detect-when-you-are-using-selenium-with-chromedriver#

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)

代码:https://github.com/justamanm/tool_files/blob/master/%E6%BB%91%E5%8A%A8%E9%AA%8C%E8%AF%81%E7%A0%81/basic_slide.py

 

其他:

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

源码:https://github.com/justamanm/tool_files/blob/master/%E6%BB%91%E5%8A%A8%E9%AA%8C%E8%AF%81%E7%A0%81/basic_slide.py

 

滑动验证码-图片滑动(极验第二代)

思路: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

 

 

极验第三代-思路

基本:按照顺序依次点击给定的文字

获取给定的文字,依次做图像识别,获取位置,点击

更复杂点的:需要额外识别出给定图片中的文字,而且大图中的有其他的很多文字

image

https://passport.ctrip.com/user/login?fnew=2

升级:按语义依次点击图片中的文字

识别出图片中的文字,语义分析或在成语库中匹配,排序,依次点击

posted @ 2019-11-04 09:28  Justaman  阅读(628)  评论(0编辑  收藏  举报