网站验证码的生成原理、难度控制,及python实现

简介: 图片验证码已经广泛的使用在各种反爬虫的场景中,验证码的的生成验证过程对于开发者来说是零成本的,对于用户体验来说可能稍差、但是对于爬虫来说是致命的和高成本的。下面将介绍使用python实现网站验证码的产生及验证的全过程,然我们对验证码的生成有所理解,同时对于机器识别在验证码利于的作用有个认识。

图片验证码已经广泛的使用在各种反爬虫的场景中,验证码的的生成验证过程对于开发者来说是零成本的,对于用户体验来说可能稍差、但是对于爬虫来说是致命的和高成本的。


下面将介绍使用python实现网站验证码的产生及验证的全过程,然我们对验证码的生成有所理解,同时对于机器识别在验证码利于的作用有个认识。


其过程是是用户请求验证后,生成验证码图片并后台session保存验证的字符串,当用户提交验证信息后,取出后台session中的字符集对比,相同的则验证通过。

def get(self):
    from PIL import Image, ImageDraw, ImageFont
    import random
    # 定义变量,用于画面的背景色、宽、高
    bgcolor = (random.randrange(20100), random.randrange(20100), 255)
    width = 100
    height = 25
    # 创建画面对象
    im = Image.new('RGB', (width, height), bgcolor)
    # 创建画笔对象
    draw = ImageDraw.Draw(im)
    # 调用画笔的point()函数绘制噪点
    for i in range(0100):
        xy = (random.randrange(0, width), random.randrange(0, height))
        fill = (random.randrange(0255), 255, random.randrange(0255))
        draw.point(xy, fill=fill)
    # 定义验证码的备选值
    str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
    # 随机选取4个值作为验证码
    rand_str = ''
    for i in range(04):
        rand_str += str1[random.randrange(0, len(str1))]
    # 构造字体对象
    font = ImageFont.truetype('static/fonts/STLITI.TTF'23)
    # 构造字体颜色
    fontcolor = (255, random.randrange(0255), random.randrange(0255))
    # 绘制4个字
    draw.text((52), rand_str[0], font=font, fill=fontcolor)
    draw.text((252), rand_str[1], font=font, fill=fontcolor)
    draw.text((502), rand_str[2], font=font, fill=fontcolor)
    draw.text((752), rand_str[3], font=font, fill=fontcolor)
    del draw
    session["verifycode"] = rand_str
    buf = io.BytesIO()
    im.save(buf, 'png')
    self.set_header('Content-Type''image/jpg')
    self.write(buf.getvalue())


session["verifycode"] = rand_str是在网站后台的session中保存正确的验证值,在post提交登陆后进行对比。


buf = io.BytesIO()、im.save(buf, 'png')是创建bytes类型的内存对象用于保存生成的图片数据。


self.set_header('Content-type','image/jpg')

self.write(buf.getvalue()),构件response相应对象返回前端。


效果如下:

2019-03-22-17_16_17.png

2019-03-22-17_16_17.png

2019-03-22-17_16_17.png

效果还是不错,生成验证码的复杂度和字符集相关、和字体相关、和噪点相关,也可以生成表达式类型的验证码,同时因为采取随机生成,几百万张图片中也不会存在相同的图片,可见验证码对于反爬虫而言任然是最简单、无成本的反爬虫措施。


------------------------------


ID:Python之战


|作|者|公(zhong)号:python之战 


专注Python,专注于网络爬虫、RPA的学习-践行-总结


喜欢研究技术瓶颈并分享,欢迎围观,共同学习。


独学而无友,则孤陋而寡闻!


---------------------------

相关文章
|
6天前
|
数据采集 开发者 Python
Python之怎么爬取图片网站
Python之怎么爬取图片网站
|
7天前
|
Web App开发 存储 安全
Python编写脚本,打开浏览器输入网址,自动化登陆网站
Python编写脚本,打开浏览器输入网址,自动化登陆网站
13 4
|
7天前
|
调度 Python
揭秘Python并发编程核心:深入理解协程与异步函数的工作原理
在Python异步编程领域,协程与异步函数成为处理并发任务的关键工具。协程(微线程)比操作系统线程更轻量级,通过`async def`定义并在遇到`await`表达式时暂停执行。异步函数利用`await`实现任务间的切换。事件循环作为异步编程的核心,负责调度任务;`asyncio`库提供了事件循环的管理。Future对象则优雅地处理异步结果。掌握这些概念,可使代码更高效、简洁且易于维护。
10 1
|
13天前
|
测试技术 开发者 Python
深入浅出:Python中的装饰器使用与原理解析
【9月更文挑战第20天】本文深入探讨Python中一个强大而神秘的功能——装饰器。通过浅显易懂的语言和生动的比喻,我们将一步步揭开装饰器的面纱,理解其背后的原理,并通过实际代码示例掌握如何运用装饰器来增强我们的函数功能。无论你是初学者还是有一定基础的开发者,这篇文章都将带给你新的启发和思考。
28 7
|
9天前
|
API 开发者 Python
Python中的魔法方法:从原理到实践
【9月更文挑战第24天】本文将深入探讨Python的魔法方法,这些特殊的方法允许对象定制其行为。文章首先揭示魔法方法的本质和重要性,然后通过代码示例展示如何利用它们来增强类的功能性。最后,我们将讨论在实际应用中应注意的事项,以确保正确和高效地使用这些方法。
|
11天前
|
中间件 API 开发者
深入理解Python Web框架:中间件的工作原理与应用策略
在Python Web开发中,中间件位于请求处理的关键位置,提供强大的扩展能力。本文通过问答形式,探讨中间件的工作原理、应用场景及实践策略,并以Flask和Django为例展示具体实现。中间件可以在请求到达视图前或响应返回后执行代码,实现日志记录、权限验证等功能。Flask通过装饰器模拟中间件行为,而Django则提供官方中间件系统,允许在不同阶段扩展功能。合理制定中间件策略能显著提升应用的灵活性和可扩展性。
15 4
|
14天前
|
缓存 Python
探索Python中的装饰器:原理与应用
本文深入探讨了Python中装饰器的概念,从基本定义到实际应用进行了系统性的阐述。通过实例展示了如何利用装饰器来增强函数功能,同时详细解释了其背后的运行机制和实现原理。此外,文章还讨论了装饰器在软件开发中的实际应用场景,为读者提供了实用的编程技巧和最佳实践。
|
2月前
|
开发框架 Java 数据管理
我使用Python开发网站的3个主要框架库,强烈推荐
我使用Python开发网站的3个主要框架库,强烈推荐
|
26天前
|
机器学习/深度学习 人工智能 算法
探索人工智能:机器学习的基本原理与Python代码实践
【9月更文挑战第6天】本文深入探讨了人工智能领域中的机器学习技术,旨在通过简明的语言和实际的编码示例,为初学者提供一条清晰的学习路径。文章不仅阐述了机器学习的基本概念、主要算法及其应用场景,还通过Python语言展示了如何实现一个简单的线性回归模型。此外,本文还讨论了机器学习面临的挑战和未来发展趋势,以期激发读者对这一前沿技术的兴趣和思考。
|
2月前
|
运维 算法 数据挖掘
5个适合新手练习的Python刷题网站
5个适合新手练习的Python刷题网站
下一篇
无影云桌面