美文网首页python爬虫
闪烁图片验证码处理

闪烁图片验证码处理

作者: 苦海飘摇 | 来源:发表于2020-04-09 10:49 被阅读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)
    
    • 结果展示




    • 经过大量检验测试我对于识别率还是挺满意的。

    相关文章

      网友评论

        本文标题:闪烁图片验证码处理

        本文链接:https://www.haomeiwen.com/subject/spqxmhtx.html