您的位置:首页 > 编程语言 > Python开发

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

2019-01-08 10:59 489 查看
版权声明:本文为博主原创文章,未经博主允许禁止转载! https://blog.csdn.net/az9996/article/details/86064122

写在项目开始前:
  在做豆瓣爬虫时,豆瓣电影中的有些信息是需要登陆之后才可以查看的,于是就产生了自动登录豆瓣的想法。
  经过一番尝试,目标已经实现,然而成功率比较有限(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.geek-share.com/detail/2667021142.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。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐