Python 豆瓣网的全自动登录(豆瓣验证码自动识别)

写在项目开始前:
  在做豆瓣爬虫时,豆瓣电影中的有些信息是需要登陆之后才可以查看的,于是就产生了自动登录豆瓣的想法。
  经过一番尝试,目标已经实现,然而成功率比较有限(25%上下,只是一个简单的统计并不准确。)
  说道验证码(详细可以参看百度百科),它的用途就是用来识别计算机和人。对于简单验证码,计算机尚能高成功率的破解,但是对于复杂验证码,计算机识别的成功率就会大幅下降。(12306的验证码简直就是噩梦!此外还有拼图验证码、标记字符验证码等等)
  若不是专门从事相关方面的研究的话,建议还是在程序中设置中断,然后手动输入验证码后再继续运行程序,这样会省下不少功夫。(例如:python中使用input()函数,程序会暂停等待输入,输入字符后程序继续。)
  打码兔也是解决验证码识别的一种方式,但其本质上还是依靠人来完成识别工作。详细可以看:http://news.mydrivers.com/1/462/462523.htm
  幸运的是豆瓣网站的验证码虽然稍显复杂但仍有降低难度的可能,因此这次尝试才能顺利的进行。

下面是正文:

这是选取得4个豆瓣验证码:
A:
在这里插入图片描述
B:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
可以看出,每个验证码由背景色、椒盐噪点、字符(黑色)三部分组成。

这里选择验证码B来进行下面的实验:

简单的思路就是:
  1:去除背景色
  2:过滤椒盐噪点
  3:图片中字符的识别

解决方案
  1:采用二值化去除背景色,即仅保留黑、白两色。这里可以使用PIL库也可以使用编写的方法,为了方便解释原理,图片处理部分我参考的资料是https://www.deeplearn.me/808.html。两者达到的效果是一样的,使用PIL库会大幅度简化操作!
在这里插入图片描述
在这里插入图片描述

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# 对图片做预处理,去除背景
#遍历图片内的每一个像素点(坐标),设置阈值threshold,
# 大于阈值的重置为白色,小于阈值的重置为黑色
def pre_concert(img):
    width, height = img.size
    threshold = 30
    for i in range(0, width):
        for j in range(0, height):
            p = img.getpixel((i, j))  # 抽取坐标(i,j)出像素点的RGB颜色值
            r, g, b = p
            if r > threshold or g > threshold or b > threshold:
                img.putpixel((i, j), WHITE)#设置坐标(i,j)处像素点的RGB颜色值为(255.255.255)
            else:
                img.putpixel((i, j), BLACK)
    img.show()
    img.save("picture\\pre_fig.jpg")

  2:去除椒盐噪点的建议采用中值滤波(效果最好),滑动窗口建议采用矩形窗口。(十字窗口对较大的噪点无法去除)

中值滤波原理https://www.cnblogs.com/tanfy/p/median_filter.html

中值滤波简单的理解就是用窗口中间的值平滑的遍历图片中的每一个像素点,如果像素点A的周围皆为黑色像素点,那么这个像素点A为字符的一部分被保留;若像素点A的周围皆为白色像素点,那么这个像素点A就是椒盐噪点,将像素点A的颜色值重置为白色。
前者用的十字窗口,后者用的矩形窗口
在这里插入图片描述在这里插入图片描述
十字窗口
在这里插入图片描述
矩形窗口
在这里插入图片描述

# 对去除背景的图片做噪点处理
def remove_noise(self, window=1):
    if window == 1:    #十字型滑动窗口
        window_x = [1, 0, 0, -1, 0]
        window_y = [0, 1, 0, 0, -1]
    elif window == 2:   #矩形滑动窗口
        window_x = [-1, 0, 1, -1, 0, 1, 1, -1, 0]
        window_y = [-1, -1, -1, 1, 1, 1, 0, 0, 0]

    width, height = self.size
    for i in range(width):
        for j in range(height):
            box = []

            for k in range(len(window_x)):
                d_x = i + window_x[k]
                d_y = j + window_y[k]
                try:
                    d_point = self.getpixel((d_x, d_y))
                    if d_point == BLACK:
                        box.append(1)
                    else:
                        box.append(0)
                except IndexError:
                    self.putpixel((i, j), WHITE)
                    continue

            box.sort()
            if len(box) == len(window_x):
                mid = box[int(len(box) / 2)]
                if mid == 1:
                    self.putpixel((i, j), BLACK)
                else:
                    self.putpixel((i, j), WHITE)

    self.show()
    self.save("picture\\mov_noise_fig.jpg")

  图片中的字符识别用的是pytesseract库,这个库要配合Tesseract-OCR软件来使用。详细介绍请看:https://blog.csdn.net/sb985/article/details/80295151
字符识别的代码很少,真是幸运!

def image_to_string(img):
    try:
        result = pytesseract.image_to_string(img)
        result = result.strip()
        return result.lower()
    except:
        return None

在这里插入图片描述

OK!到此验证码的识别已经成功,只需要在自动登录时将所得结果发送到webpage即可。
web自动化可以使用selenium库中的webdriver。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值