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.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。
- 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码
- selenium和Python3.6实现招聘狗网站自动识别验证码登录、列表页、详情页爬取
- Python爬虫之自动登录与验证码识别
- python爬虫之自动登录与验证码识别
- Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
- Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录
- Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录
- Python 实现全自动登录(真正的全自动,自动识别验证码)
- python自动登录12306并自动点击验证码完成登录的源代码
- 自动模拟登录豆瓣及验证码处理
- 用Python实现china-pub登录验证码的识别--代码版
- Python完全识别验证码自动登录
- python自动登录12306并自动点击验证码完成登录的实现源代码
- Python识别平台登录验证码
- Python3.5+sklearn 使用SVM自动识别字母验证码
- 【Python】【验证码识别】python 模拟登陆时,验证码自动识别问题
- python爬虫scrapy框架——人工识别知乎登录知乎倒立文字验证码和数字英文验证码
- 新手详细教程:python3基于SVM识别学校登录页面验证码
- python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)
- 黑龙江大学 校园网 师生服务 身份验证 查成绩 查绩点等 API 以及示例程序 (Python 验证码自动识别)