python模拟微博登陆之验证码自动处理

前言:
之前玩过微博爬虫,可以实现验证码的自动解锁和账号自动登录,最近朋友说也想玩玩微博,问我要代码,运行后发现无法自动登录, 之前的代码用的是九茶大神的, 搜了发现他没有更新,看很多网友也在求解决方法,那我就只能自己动手解决问题了。

先不废话,直接上代码:WeiboVerificationCode

解决问题的思路和九茶是一样的,只是修改了大神的两部分代码:

  1. 更新匹配模型, ims.py -> images.py,
  2. 更新匹配算法,利用欧氏距离计算相似度, getType(browser) -> getType_similirity(browser)

更新ims的原因是因为利用欧式距离计算后发现调换“2”和“3”的位置或者当“4”在第个三位置时“1”都在最前边或者最后边,因此这个模型已经不能很好的识别验证码,于是我就更新了这个模型,这样代码就简洁一些。

ims和images的区别是数据结构不一样, ims是由二维数组构成, 而images是由一维数组构成。
以下是计算相似度的代码:

def getType_similirity(browser):
    """ 识别图形路径 ,采用欧氏距离计算相似度"""
    time.sleep(3.5)
    im0 = Image.open(StringIO.StringIO(browser.get_screenshot_as_png()))
    box = browser.find_element_by_id('patternCaptchaHolder')
    # 更改因为系统设置不同而造成的不兼容,以字体100%为准
    im0 = im0.resize((1034, 708))
    im = im0.crop((int(box.location['x']) + 10, int(box.location['y']) + 100,
                   int(box.location['x']) + box.size['width'] - 10,
                   int(box.location['y']) + box.size['height'] - 10)).convert('L')
    newBox = getExactly(im)
    im = im.crop(newBox)
    data = list(im.getdata())
    data_vec = np.array(data)
    vectDict = {}
    for i, j in images.items():
        vect = euclidean_distances(data_vec, j)
        vectDict[i] = vect[0][0]
    """对欧氏距离计算结果排序,取最小值"""
    sortDict = sorted(vectDict.iteritems(), key=lambda d: d[1], reverse=True)
    ttype = sortDict[-1][0]
    px0_x = box.location['x'] + 40 + newBox[0]
    px1_y = box.location['y'] + 130 + newBox[1]
    PIXELS.append((px0_x, px1_y))
    PIXELS.append((px0_x + 100, px1_y))
    PIXELS.append((px0_x, px1_y + 100))
    PIXELS.append((px0_x + 100, px1_y + 100))
    return ttype

经过几十次的测试,成功率为百分之百,好了,废话不多说, 有什么问题加QQ群聊(526855734)

九茶博客: http://blog.csdn.net/bone_ace/article/details/71056741

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值