闪烁图片验证码处理
2020-04-09 本文已影响0人
苦海飘摇
今天,同事在爬一个网站的数据时遇到了闪烁验证码,这里我帮他处理一下。
- 先将该验证码
(gif格式)
转换成一个个的png图片。
感谢HJingY的分享:分解gif
url = "https://www.******.cn:****/stcs/getCaptcha"
res = sess.get(url=url, headers=headers).content
im = Image.open(io.BytesIO(res))
im.save('1.png')
r = dm(im)
im.seek(im.tell() + 1)
im.save('2.png')
r = dm(im)
im.seek(im.tell() + 1)
im.save('3.png')
r = dm(im)
im.seek(im.tell() + 1)
im.save('4.png')
r = dm(im)
1.png
2.png
3.png
4.png
这里的dm()是我自己做的验证码识别模块。
- 经过多次的验证码刷新得到了一个结果,第二张图片能显示全所有验证码,一开始就只用了第二张图片进行识别,但是识别率真是低的可怜。这是因为第一个字母不清晰,而且还有一个个的小圈圈影响结果。
- 因此我突发奇想看能不能一张张的识别然后将识别结果整合一下,因此我做了以下尝试。
a = {'1': '', '2': '', '3': '', '4': ''} # 根据key值保存对应识别结果
url = "https://www.globalsms.cn:8443/stcs/getCaptcha"
res = sess.get(url=url, headers=headers).content
im = Image.open(io.BytesIO(res))
im.save('1.png')
r = dm(im)
a['1'] = r
im.seek(im.tell() + 1)
im.show() # 由于第二张能显示全所有验证码,因此我直接将其打开而不是保存
r = dm(im)
a['2'] = r
im.seek(im.tell() + 1)
im.save('3.png')
r = dm(im)
a['3'] = r
im.seek(im.tell() + 1)
im.save('4.png')
r = dm(im)
a['4'] = r
print(a)
- 进行多次测试,发现第四张图片和第三章图片识别的前两位结果比较好
(这也正和以上的图片颜色深度吻合)
,但偶尔也会出现第二张和第三张结果好的时候,甚至三张的识别结果都不相同的时候也有,因此根据大量的测试我写出了以下代码。
# 前两位
if a.get('4')[:2] == a.get('3')[:2] or a.get('2')[:2] == a.get('3')[:2]:
res = a.get('3')[:2]
elif a.get('2')[:1] == a.get('3')[1:2]:
res = a.get('3')[:2]
else:
res = a.get('4')[:2]
- 至于最后两位就简单多了,分别选用第三张的最后一位和第一张的最后一位。
# 第三位
res += a.get('3')[-1:]
# 最后一位
res += a.get('1')[-1:]
print(res)
-
结果展示
- 经过大量检验测试我对于识别率还是挺满意的。