python源码分享网站(python分享平台)
请问谁有靠谱的Python全套视频教程,求推荐分享
Python基础到高级视频教程百度网盘免费资源在线学习 ?
链接:
提取码: kkch
Python基础到高级视频教程 【5】python项目开发 【4】Pyhon实战开发 【3】python运维 【02】Python进阶开发 【01】Python基础开发(零基础入门学习)【内有安装包】 python-3.7.0.rar 安装包 059论一只爬虫的自我修养7:正则表达式3 058论一只爬虫的自我修养6:正则表达式2 057论一只爬虫的自我修养5:正则表达式 056轮一只爬虫的自我修养4:OOXX 055论一只爬虫的自我修养3:隐藏 054论一只爬虫的自我修养2:实战 053论一只爬虫的自我修养
python爬虫网站的登录url怎么找
抓取网页所有url的简单Python爬虫源码,只用到了一个Python标准库urllib模块,没有用BeautifulSoup第三方库。python 多线程爬虫是一个很实用的工具。
Python爬虫源码发,如下:
import urllib
content = urllib.urlopen('').read()
s1=0
while s1=0:
begin = content.find(r'a',s1) m1="content.find(r'" href=",begin)
m2 = content.find(r"',m1)
s1 = m2
if(begin=0):
break
elif(content[m1:m2].find(r" ")!=-1):
m2 = content[m1:m2].find(r' ')
url = content[m1+6:m1+m2-1]
print url
elif m2=0:
url = content[m1+6:m2-1]
print url
print "end."
/a',s1)
(源码分享)利用Python识别提取图像文字(中文英文都可以)
你想了解怎么利用程序自动识别网站验证码吗?识别提取图像文字(中文英文都可以)
分享一点简单有用的小项目:python
源码分享如下:
看视频教程链接:(点击识别图像文字视频教程链接)
一、首先需要安装 Tesseract模块及 语言包
Tesseract OCR光学字符识别
Windows系统:
安装网站 (放在不需要权限的纯英文路径下):
:
可以下载一些语言包:
安装完成后,如果想要在命令行中使用Tesseract,那么应该设置环境变量。
还有一个环境变量需要设置的是,要把训练的数据文件路径也放到环境变量中。
在环境变量中,添加一个TESSDATA_PREFIX=C:path_to_tesseractdata eseractdata。
在Python代码中操作tesseract。需要安装一个库,叫做pytesseract。通过pip的方式即可安装:
pip install pytesseract
并且,需要读取图片,需要借助一个第三方库叫做PIL。通过pip list看下是否安装。如果没有安装,通过pip的方式安装:
pip install PIL
使用pytesseract将图片上的文字转换为文本文字的示例代码如下:
py开发语言中哪里有知识库呢?
第一:Python 标准库:
应该浏览一下这份文档,它为标准库中的类型、函数和模块提供了完整(尽管很简略)的参考资料。标准的 Python 发布版包括了 大量 的附加模块。其中有针对读取 Unix 邮箱、接收 HTTP 文档、生成随机数、解析命令行选项、写 CGI 程序、压缩数据以及很多其它任务的模块。略读一下库参考会给你很多解决问题的思路。
安装 Python 模块 展示了如何安装其他 Python 用户编写的附加模块。
Python 语言参考: 详细说明了 Python 语法和语义。
它读起来很累,不过对于语言本身,有份完整的手册很有用。
第二:其它 Python 资源:
: Python 官方网站。它包含代码、文档和 Web 上与 Python 有关的页面链接该网站镜像于全世界的几处其它问题,类似欧洲、日本和澳大利亚。
镜像可能会比主站快,这取决于你的地理位置。
: 快速访问 Python 的文档。
: Python 包索引,以前昵称为奶酪店,索引了可供下载的,用户创建的 Python 模块。如果你发布了代码,可以注册到这里,这样别人可以找到它。
: Python 食谱是大量的示例代码、大型的集合,和有用的脚本。
值得关注的是这次资源已经结集成书,名为《Python 食谱》(O’Reilly Associates, ISBN 0-596-00797-3。)
:?The Scientific Python 项目包括数组快速计算和处理模块,和大量线性代数、傅里叶变换、非线性solvers、随机数分布,统计分析以及类似的包。
与 Python 有关的问题,以及问题报告,可以发到新闻组 comp.lang.python ,或者发送到邮件组 python-list@python.org 。新闻组和邮件组是开放的,所以发送的消息可以自动的跟到另一个之后。每天有超过 120 个投递(高峰时有数百),提问(以及回答)问题,为新功能提建议,发布新模块。在发信之前,请查阅 常见问题 (亦称 FAQ),或者在 Python 源码发布包的 Misc/ 目录中查阅。邮件组也可以在??访问。FAQ回答了很多被反复提到的问题,很可能已经解答了你的问题。
Next Previous
python源码如何搭建网络玩法
Python搭建网站,利用现成的框架、可利用Flask搭建一个网站。
Flask创建一个应用很简单,只需要一行代码就可以创建一个应用。
Flask是一个使用 Python 编写的轻量级 Web 应用框架,其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。
如何利用Python做简单的验证码识别
1???摘要
验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的?防火墙?功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻。本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义。
然后经过了一年的时间,笔者又研究和get到了一种更强大的基于CNN卷积神经网络的直接端到端的验证识别技术(文章不是我的,然后我把源码整理了下,介绍和源码在这里面):
基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
2???关键词
关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL
3???免责声明
本文研究所用素材来自于某旧Web框架的网站?完全对外公开?的公共图片资源。
本文只做了该网站对外公开的公共图片资源进行了爬取,?并未越权?做任何多余操作。
本文在书写相关报告的时候已经?隐去?漏洞网站的身份信息。
本文作者?已经通知?网站相关人员此系统漏洞,并积极向新系统转移。
本报告的主要目的也仅是用于?OCR交流学习?和引起大家对?验证安全的警觉?。
4???引言
关于验证码的非技术部分的介绍,可以参考以前写的一篇科普类的文章:
互联网安全防火墙(1)--网络验证码的科普
里面对验证码的种类,使用场景,作用,主要的识别技术等等进行了讲解,然而并没有涉及到任何技术内容。本章内容则作为它的?技术补充?来给出相应的识别的解决方案,让读者对验证码的功能及安全性问题有更深刻的认识。
5???基本工具
要达到本文的目的,只需要简单的编程知识即可,因为现在的机器学习领域的蓬勃发展,已经有很多封装好的开源解决方案来进行机器学习。普通程序员已经不需要了解复杂的数学原理,即可以实现对这些工具的应用了。
主要开发环境:
python3.5
python SDK版本
PIL
图片处理库
libsvm
开源的svm机器学习库
关于环境的安装,不是本文的重点,故略去。
6???基本流程
一般情况下,对于字符型验证码的识别流程如下:
准备原始图片素材
图片预处理
图片字符切割
图片尺寸归一化
图片字符标记
字符图片特征提取
生成特征和标记对应的训练数据集
训练特征标记数据生成识别模型
使用识别模型预测新的未知图片集
达到根据“图片”就能返回识别正确的字符集的目标
7???素材准备
7.1???素材选择
由于本文是以初级的学习研究目的为主,要求?“有代表性,但又不会太难”?,所以就直接在网上找个比较有代表性的简单的字符型验证码(感觉像在找漏洞一样)。
最后在一个比较旧的网站(估计是几十年前的网站框架)找到了这个验证码图片。
原始图:
放大清晰图:
此图片能满足要求,仔细观察其具有如下特点。
有利识别的特点?:
由纯阿拉伯数字组成
字数为4位
字符排列有规律
字体是用的统一字体
以上就是本文所说的此验证码简单的重要原因,后续代码实现中会用到
不利识别的特点?:
图片背景有干扰噪点
这虽然是不利特点,但是这个干扰门槛太低,只需要简单的方法就可以除去
7.2???素材获取
由于在做训练的时候,需要大量的素材,所以不可能用手工的方式一张张在浏览器中保存,故建议写个自动化下载的程序。
主要步骤如下:
通过浏览器的抓包功能获取随机图片验证码生成接口
批量请求接口以获取图片
将图片保存到本地磁盘目录中
这些都是一些IT基本技能,本文就不再详细展开了。
关于网络请求和文件保存的代码,如下:
def downloads_pic(**kwargs):
? ?pic_name = kwargs.get('pic_name', None)
? ?url = 'httand_code_captcha/'
? ?res = requests.get(url, stream=True)
? ?with open(pic_path + pic_name+'.bmp', 'wb') as f: ? ? ? ?for chunk in res.iter_content(chunk_size=1024): ? ? ? ? ? ?if chunk: ?# filter out keep-alive new chunks ? ? ? ? ? ? ? ?f.write(chunk)
? ? ? ? ? ? ? ?f.flush()
? ? ? ?f.close()
循环执行N次,即可保存N张验证素材了。
下面是收集的几十张素材库保存到本地文件的效果图:
8???图片预处理
虽然目前的机器学习算法已经相当先进了,但是为了减少后面训练时的复杂度,同时增加识别率,很有必要对图片进行预处理,使其对机器识别更友好。
针对以上原始素材的处理步骤如下:
读取原始图片素材
将彩色图片二值化为黑白图片
去除背景噪点
8.1???二值化图片
主要步骤如下:
将RGB彩图转为灰度图
将灰度图按照设定阈值转化为二值图
image = Image.open(img_path)
imgry = image.convert('L') ?# 转化为灰度图table = get_bin_table()
out = imgry.point(table, '1')
上面引用到的二值函数的定义如下:
1234567891011121314? ?def?get_bin_table(threshold=140):????"""????获取灰度转二值的映射table????:param threshold:????:return:????"""????table?=?[]????for?i?in?range(256):????????if?i threshold:????????????table.append(0)????????else:????????????table.append(1)?????return?table? ?
由PIL转化后变成二值图片:0表示黑色,1表示白色。二值化后带噪点的?6937?的像素点输出后如下图:
1111000111111000111111100001111100000011
1110111011110111011111011110111100110111
1001110011110111101011011010101101110111
1101111111110110101111110101111111101111
1101000111110111001111110011111111101111
1100111011111000001111111001011111011111
1101110001111111101011010110111111011111
1101111011111111101111011110111111011111
1101111011110111001111011110111111011100
1110000111111000011101100001110111011111
如果你是近视眼,然后离屏幕远一点,可以隐约看到?6937?的骨架了。
8.2???去除噪点
在转化为二值图片后,就需要清除噪点。本文选择的素材比较简单,大部分噪点也是最简单的那种?孤立点,所以可以通过检测这些孤立点就能移除大量的噪点。
关于如何去除更复杂的噪点甚至干扰线和色块,有比较成熟的算法:?洪水填充法 Flood Fill?,后面有兴趣的时间可以继续研究一下。
本文为了问题简单化,干脆就用一种简单的自己想的?简单办法?来解决掉这个问题:
对某个?黑点?周边的九宫格里面的黑色点计数
如果黑色点少于2个则证明此点为孤立点,然后得到所有的孤立点
对所有孤立点一次批量移除。
下面将详细介绍关于具体的算法原理。
将所有的像素点如下图分成三大类
顶点A
非顶点的边界点B
内部点C
种类点示意图如下:
其中:
A类点计算周边相邻的3个点(如上图红框所示)
B类点计算周边相邻的5个点(如上图红框所示)
C类点计算周边相邻的8个点(如上图红框所示)
当然,由于基准点在计算区域的方向不同,A类点和B类点还会有细分:
A类点继续细分为:左上,左下,右上,右下
B类点继续细分为:上,下,左,右
C类点不用细分
然后这些细分点将成为后续坐标获取的准则。
主要算法的python实现如下:
def sum_9_region(img, x, y): ? ?"""
? ?9邻域框,以当前点为中心的田字框,黑点个数
? ?:param x:
? ?:param y:
? ?:return: ? ?"""
? ?# todo 判断图片的长宽度下限
? ?cur_pixel = img.getpixel((x, y)) ?# 当前像素点的值
? ?width = img.width
? ?height = img.height ? ?if cur_pixel == 1: ?# 如果当前点为白色区域,则不统计邻域值
? ? ? ?return 0 ? ?if y == 0: ?# 第一行
? ? ? ?if x == 0: ?# 左上顶点,4邻域
? ? ? ? ? ?# 中心点旁边3个点
? ? ? ? ? ?sum = cur_pixel \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x, y + 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y + 1)) ? ? ? ? ? ?return 4 - sum ? ? ? ?elif x == width - 1: ?# 右上顶点
? ? ? ? ? ?sum = cur_pixel \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x, y + 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y + 1)) ? ? ? ? ? ?return 4 - sum ? ? ? ?else: ?# 最上非顶点,6邻域
? ? ? ? ? ?sum = img.getpixel((x - 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y + 1)) \ ? ? ? ? ? ? ? ? ?+ cur_pixel \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x, y + 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y + 1)) ? ? ? ? ? ?return 6 - sum ? ?elif y == height - 1: ?# 最下面一行
? ? ? ?if x == 0: ?# 左下顶点
? ? ? ? ? ?# 中心点旁边3个点
? ? ? ? ? ?sum = cur_pixel \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y - 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x, y - 1)) ? ? ? ? ? ?return 4 - sum ? ? ? ?elif x == width - 1: ?# 右下顶点
? ? ? ? ? ?sum = cur_pixel \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x, y - 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y - 1)) ? ? ? ? ? ?return 4 - sum ? ? ? ?else: ?# 最下非顶点,6邻域
? ? ? ? ? ?sum = cur_pixel \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x, y - 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y - 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y - 1)) ? ? ? ? ? ?return 6 - sum ? ?else: ?# y不在边界
? ? ? ?if x == 0: ?# 左边非顶点
? ? ? ? ? ?sum = img.getpixel((x, y - 1)) \ ? ? ? ? ? ? ? ? ?+ cur_pixel \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x, y + 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y - 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y + 1)) ? ? ? ? ? ?return 6 - sum ? ? ? ?elif x == width - 1: ?# 右边非顶点
? ? ? ? ? ?# print('%s,%s' % (x, y))
? ? ? ? ? ?sum = img.getpixel((x, y - 1)) \ ? ? ? ? ? ? ? ? ?+ cur_pixel \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x, y + 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y - 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y + 1)) ? ? ? ? ? ?return 6 - sum ? ? ? ?else: ?# 具备9领域条件的
? ? ? ? ? ?sum = img.getpixel((x - 1, y - 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x - 1, y + 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x, y - 1)) \ ? ? ? ? ? ? ? ? ?+ cur_pixel \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x, y + 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y - 1)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y)) \ ? ? ? ? ? ? ? ? ?+ img.getpixel((x + 1, y + 1)) ? ? ? ? ? ?return 9 - sum
Tips:这个地方是相当考验人的细心和耐心程度了,这个地方的工作量还是蛮大的,花了半个晚上的时间才完成的。
计算好每个像素点的周边像素黑点(注意:PIL转化的图片黑点的值为0)个数后,只需要筛选出个数为?1或者2?的点的坐标即为?孤立点?。这个判断方法可能不太准确,但是基本上能够满足本文的需求了。
经过预处理后的图片如下所示:
对比文章开头的原始图片,那些?孤立点?都被移除掉,相对比较?干净?的验证码图片已经生成。
9???图片字符切割
由于字符型?验证码图片?本质就可以看着是由一系列的?单个字符图片?拼接而成,为了简化研究对象,我们也可以将这些图片分解到?原子级?,即:?只包含单个字符的图片。
于是,我们的研究对象由?“N种字串的组合对象”?变成?“10种阿拉伯数字”?的处理,极大的简化和减少了处理对象。
9.1???分割算法
现实生活中的字符验证码的产生千奇百怪,有各种扭曲和变形。关于字符分割的算法,也没有很通用的方式。这个算法也是需要开发人员仔细研究所要识别的字符图片的特点来制定的。
当然,本文所选的研究对象尽量简化了这个步骤的难度,下文将慢慢进行介绍。
使用图像编辑软件(PhoneShop或者其它)打开验证码图片,放大到像素级别,观察其它一些参数特点:
可以得到如下参数:
整个图片尺寸是 40*10
单个字符尺寸是 6*10
左右字符和左右边缘相距2个像素
字符上下紧挨边缘(即相距0个像素)
这样就可以很容易就定位到每个字符在整个图片中占据的像素区域,然后就可以进行分割了,具体代码如下:
def get_crop_imgs(img): ? ?"""
? ?按照图片的特点,进行切割,这个要根据具体的验证码来进行工作. # 见原理图
? ?:param img:
? ?:return: ? ?"""
? ?child_img_list = [] ? ?for i in range(4):
? ? ? ?x = 2 + i * (6 + 4) ?# 见原理图
? ? ? ?y = 0
? ? ? ?child_img = img.crop((x, y, x + 6, y + 10))
? ? ? ?child_img_list.append(child_img) ? ?return child_img_list
然后就能得到被切割的?原子级?的图片元素了:
9.2???内容小结
基于本部分的内容的讨论,相信大家已经了解到了,如果验证码的干扰(扭曲,噪点,干扰色块,干扰线……)做得不够强的话,可以得到如下两个结论:
4位字符和40000位字符的验证码区别不大
纯字母
不区分大小写。分类数为26
区分大小写。分类数为52
纯数字。分类数为10
数字和区分大小写的字母组合。分类数为62
纯数字?和?数字及字母组合?的验证码区别不大
在没有形成?指数级或者几何级?的难度增加,而只是?线性有限级?增加计算量时,意义不太大。
10???尺寸归一
本文所选择的研究对象本身尺寸就是统一状态:6*10的规格,所以此部分不需要额外处理。但是一些进行了扭曲和缩放的验证码,则此部分也会是一个图像处理的难点。
11???模型训练步骤
在前面的环节,已经完成了对单个图片的处理和分割了。后面就开始进行?识别模型?的训练了。
整个训练过程如下:
大量完成预处理并切割到原子级的图片素材准备
对素材图片进行人为分类,即:打标签
定义单张图片的识别特征
使用SVM训练模型对打了标签的特征文件进行训练,得到模型文件
12???素材准备
本文在训练阶段重新下载了同一模式的4数字的验证图片总计:3000张。然后对这3000张图片进行处理和切割,得到12000张原子级图片。
在这12000张图片中删除一些会影响训练和识别的强干扰的干扰素材,切割后的效果图如下:
13???素材标记
由于本文使用的这种识别方法中,机器在最开始是不具备任何 数字的观念的。所以需要人为的对素材进行标识,告诉?机器什么样的图片的内容是 1……。
这个过程叫做?“标记”。
具体打标签的方法是:
为0~9每个数字建立一个目录,目录名称为相应数字(相当于标签)
人为判定?图片内容,并将图片拖到指定数字目录中
每个目录中存放100张左右的素材
一般情况下,标记的素材越多,那么训练出的模型的分辨能力和预测能力越强。例如本文中,标记素材为十多张的时候,对新的测试图片识别率基本为零,但是到达100张时,则可以达到近乎100%的识别率
14???特征选择
对于切割后的单个字符图片,像素级放大图如下:
从宏观上看,不同的数字图片的本质就是将黑色按照一定规则填充在相应的像素点上,所以这些特征都是最后围绕像素点进行。
字符图片?宽6个像素,高10个像素?,理论上可以最简单粗暴地可以定义出60个特征:60个像素点上面的像素值。但是显然这样高维度必然会造成过大的计算量,可以适当的降维。
通过查阅相应的文献?[2],给出另外一种简单粗暴的特征定义:
每行上黑色像素的个数,可以得到10个特征
每列上黑色像素的个数,可以得到6个特征
最后得到16维的一组特征,实现代码如下:
def get_feature(img): ? ?"""
? ?获取指定图片的特征值,
? ?1. 按照每排的像素点,高度为10,则有10个维度,然后为6列,总共16个维度
? ?:param img_path:
? ?:return:一个维度为10(高度)的列表 ? ?"""
? ?width, height = img.size
? ?pixel_cnt_list = []
? ?height = 10 ? ?for y in range(height):
? ? ? ?pix_cnt_x = 0 ? ? ? ?for x in range(width): ? ? ? ? ? ?if img.getpixel((x, y)) == 0: ?# 黑色点
? ? ? ? ? ? ? ?pix_cnt_x += 1
? ? ? ?pixel_cnt_list.append(pix_cnt_x) ? ?for x in range(width):
? ? ? ?pix_cnt_y = 0 ? ? ? ?for y in range(height): ? ? ? ? ? ?if img.getpixel((x, y)) == 0: ?# 黑色点
? ? ? ? ? ? ? ?pix_cnt_y += 1
? ? ? ?pixel_cnt_list.append(pix_cnt_y) ? ?return pixel_cnt_list
然后就将图片素材特征化,按照?libSVM?指定的格式生成一组带特征值和标记值的向量文