Python机器学习方法智能识别亚马逊验证码

简介:

概述

亚马逊网站验证码全部由英文字母组成,每个字母的形式也是多样的,通过Tesseract-OCR技术识别效率还是比较低,非常不理想。这里采用向量空间技术进行训练识别,经测试,识别率可达到95%,这个识别率通过训练库的不断增加还可继续提高。下面废话不多说,直接上干货。

技术详解

亚马逊验证码如下图:

e95bb376810bc678dc1c7181c0f140aaf3a7e095

我这里收集了大量的亚马逊网站验证码,下面将随机抽一张验证码为mnyaph作详细讲解,如下图:

92ee6215643935e796345772ba59b8f6b6580b2e

总体思路

1.将原图片作二值化等特殊处理转换得到低像素图片

2.分割出每个字母的图片,并加入到训练库中

3.每个字母图片在训练库中训练

4.将每个字母图片训练后的结果依次组合起来,就是最终验证码

使用技术库

PIL :图片处理库

scipy : 科学计算库

 ●   原图片处理

这里将jpg格式转换为更小容量的gif格式,方便后面处理,并将原图片中的黑色像素(0)拷贝到新的相同尺寸的白色图片上,得到新的Image对象。下图为处理后的图片

cb47c4863cbcb4f4643c72f590b8898d4765c56d


im = Image.open(image_file)

im = im.convert('P')

im_size = im.size

new_im = Image.new('P', im_size, 255)

im_width = im_size[0]
im_height = im_size[1]

for y in range(im_height):
for x in range(im_width):
pixel = im.getpixel((x, y))
if pixel ==0:
new_im.putpixel((x, y), pixel)
 ●   切割图片得到单个字母图片

纵向切割出每个字母,切割规则为:依次纵向检索每个像素点,在横向(x轴)固定的前提下:若遇到像素值为0,则表示为黑色的字母;若整个纵向都没遇到黑色(0),则表示是分割点。我们可以得到一样图片的横向(x轴)的所有分割点的坐标,最后分割即可。如下图:

55404907c523e60d7fc81fa0d038562d43733824

计算得到的切割坐标,如下:

df6cccb6efd9157c50033f382f5c227e21a8d8b8


def get_x_coord(image) -> '返回切割的x坐标':
image_width = image.size[0]
image_height = image.size[1]

crop_list = []
start_pos = 0
is_start_one_char = False

for x in range(image_width):
is_black_pos = False
for y in range(image_height):
pixel = image.getpixel((x,y))
if pixel == 0:
if is_start_one_char == False:
start_pos = x
is_black_pos = True
is_start_one_char = True
break
if is_start_one_char== True and is_black_pos == False:
end_pos = x
is_start_one_char = False
crop_list.append((start_pos, end_pos))

return crop_list
 ●   单个字母图片加入到训练库中

将分割出的每个字母图片加入到训练库中,方便后面训练匹配,训练库中的数量越多识别率越高。将每个字母分类放入不同的文件夹中,如下所示:

fb761707069ccb73dc42a4f5ddb9ac913eba4acf

例如a文件夹中的图片如下:

36991e499b081dab76941e882f74a53fb9092b29

 ●    训练识别单个字母图片

拿到一张单个字母图片后,去训练库中匹配每个图片,计算出相似度最高的,记录出相应的字母文件夹即为最终的字母。

匹配算法:AI与向量空间算法,通俗点讲就是原图片的所有像素点与训练库中的每张图片的所有像素点计算余弦值,余弦值越大,相似度越高。

具体方法是:计算出原图片与训练库中的每张图片像素的余弦值,选出最大值对应的训练库中的文件夹名即为最终的字母。

如下为匹配的结果,与原图片完全吻合

8dd940f46acf5c75bbe3b73cdec9e37054e0df31


match_captcha = []
for crop in crop_list:
crop_im = new_im.crop((crop[0], 0, crop[1], im_height)) #(左上x, 左上y, 右下x, 右下y)
filename = 'e:/crop/' + str(time.time()) + '.gif'
# crop_im.save(filename)

all_result = [] #单个切片的所有字母的相似性

remove_letter = ['d', 'i', 'o', 'q', 's', 'v', 'w', 'z']
for letter in list(set(string.ascii_lowercase)- set(remove_letter)):

refer_image_dir = r'E:\training_library\%s' % letter

for refer_image in os.listdir(refer_image_dir):
refer_im = Image.open(os.path.join(refer_image_dir, refer_image))

crop_list = list(crop_im.getdata())
refer_list = list(refer_im.getdata())
min_count = min(len(crop_list), len(refer_list))

result = 1 - spatial.distance.cosine(crop_list[:min_count-1], refer_list[:min_count-1])
all_result.append({'letter' : letter, 'result' : result})

match_letter = max(all_result, key=lambda x: x['result']).get('letter')
match_captcha.append(match_letter)

print('验证码为:{0}'.format(''.join(match_captcha)))

经测试,每个字母图片的识别时间大约为1s左右,所以一张亚马逊验证码的识别时间大约为5-6s,这个时间是非常可以接受的。


原文发布时间为:2018-11-7

本文作者:zarten

本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区”。

相关文章
|
机器学习/深度学习 数据采集 API
Python自动化解决滑块验证码的最佳实践
Python自动化解决滑块验证码的最佳实践
|
机器学习/深度学习 数据采集 算法
量子机器学习入门:三种数据编码方法对比与应用
在量子机器学习中,数据编码方式决定了量子模型如何理解和处理信息。本文详解角度编码、振幅编码与基础编码三种方法,分析其原理、实现及适用场景,帮助读者选择最适合的编码策略,提升量子模型性能。
924 8
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
1509 12
Scikit-learn:Python机器学习的瑞士军刀
|
机器学习/深度学习 数据采集 人工智能
智能嗅探AJAX触发:机器学习在动态渲染中的创新应用
随着Web技术发展,动态加载数据的网站(如今日头条)对传统爬虫提出新挑战:初始HTML无完整数据、请求路径动态生成且易触发反爬策略。本文以爬取“AI”相关新闻为例,探讨了通过浏览器自动化、抓包分析和静态逆向接口等方法采集数据的局限性,并提出借助机器学习智能识别AJAX触发点的解决方案。通过特征提取与模型训练,爬虫可自动推测数据接口路径并高效采集。代码实现展示了如何模拟AJAX请求获取新闻标题、简介、作者和时间,并分类存储。未来,智能化将成为采集技术的发展趋势。
526 1
智能嗅探AJAX触发:机器学习在动态渲染中的创新应用
|
机器学习/深度学习 数据采集 存储
动态渲染页面智能嗅探:机器学习判定AJAX加载触发条件
本文介绍了一种基于机器学习的智能嗅探系统,用于自动判定动态渲染页面中AJAX加载的最佳触发时机。系统由请求分析、机器学习判定、数据采集和文件存储四大模块构成,采用爬虫代理技术实现高效IP切换,并通过模拟真实浏览器访问抓取微博热搜及评论数据。核心代码示例展示了如何调用微博接口获取榜单与评论,并利用预训练模型预测AJAX触发条件,最终将结果以JSON或CSV格式存储。该方案提升了动态页面加载效率,为信息采集与热点传播提供了技术支持。
524 15
动态渲染页面智能嗅探:机器学习判定AJAX加载触发条件
|
机器学习/深度学习 数据采集 算法
Java 大视界 -- Java 大数据机器学习模型在金融衍生品定价中的创新方法与实践(166)
本文围绕 Java 大数据机器学习模型在金融衍生品定价中的应用展开,分析定价现状与挑战,阐述技术原理与应用,结合真实案例与代码给出实操方案,助力提升金融衍生品定价的准确性与效率。
Java 大视界 -- Java 大数据机器学习模型在金融衍生品定价中的创新方法与实践(166)
|
机器学习/深度学习 人工智能 算法
大数据与机器学习:数据驱动的智能时代
本文探讨了大数据与机器学习在数字化时代的融合及其深远影响。大数据作为“新时代的石油”,以其4V特性(体量、多样性、速度、真实性)为机器学习提供燃料,而机器学习通过监督、无监督、强化和深度学习等技术实现数据价值挖掘。两者协同效应显著,推动医疗、金融、零售、制造等行业创新。同时,文章分析了数据隐私、算法偏见、可解释性及能耗等挑战,并展望了边缘计算、联邦学习、AutoML等未来趋势。结语强调技术伦理与实际价值并重,倡导持续学习以把握智能时代机遇。
642 13
|
数据采集 Web App开发 文字识别
Python爬虫多次请求后被要求验证码的应对策略
Python爬虫多次请求后被要求验证码的应对策略
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
人工智能 算法 数据安全/隐私保护
[oeasy]python080如何生成验证码_随机数字密码_真随机
本文介绍了如何生成随机验证码的过程,从简单的随机数字生成到包含数字、大小写字母及符号的复杂验证码。通过 Python 的 `random` 和 `string` 模块,逐步扩展字符集并确保结果满足特定要求(如包含各类字符)。同时探讨了随机数生成的本质,指出计算机中的“随机”实际上是基于算法和种子值的伪随机,并非真正的物理随机。最后总结了验证码的生成原理及其在实际应用中的意义,为读者揭开日常生活中验证码背后的编程逻辑。
759 8

热门文章

最新文章

推荐镜像

更多