专栏名称: Python学习交流
每天更新,更新python相关的知识。希望诸君有所收获!
目录
相关文章推荐
Python爱好者社区  ·  史上最强!PINN杀疯了 ·  昨天  
Python爱好者社区  ·  英伟达憾失DeepSeek关键人才?美国放走 ... ·  昨天  
Python爱好者社区  ·  1885页的Python完全版电子书 ·  3 天前  
Python爱好者社区  ·  多模态,杀疯了 ·  2 天前  
Python开发者  ·  o3-mini 碾压 DeepSeek ... ·  6 天前  
51好读  ›  专栏  ›  Python学习交流

验证码是爬虫非常头疼的问题!今天通过十五分钟就教你搞定验证码

Python学习交流  · 公众号  · Python  · 2018-05-31 14:57

正文




Adrian没有访问生成验证码图片的应用的源代码的权限。为了破解这个系统,他不得不下载成百上千个示例图像并手动解答它们,用以训练他的深度学习系统。

但是如果我们想打破一个开放源代码的验证码系统,将会怎么样?

我去http://wordpress.org插件注册表搜索“验证码”。最靠前的结果是一个叫“真正简单的验证码”的插件,有超过100万个活跃安装:




好的,所以验证码图像似乎是四个字母。让我们在PHP源代码中验证这一点:


是的,它会产生一个四字母的验证码,并采用随机组合的四种不同的字体。我们可以看到,它从不在代码中使用“O”或“I”,以避免用户混淆。这给了我们总共32个可能需要识别的字母和数字。没问题!


TensorFlow

TensorFlow是谷歌的机器学习库。我们会在Keras中写代码,但Keras并没有真正实现神经网络的逻辑本身,它其实是在后台调用谷歌的TensorFlow进行计算。

好,现在让我们回到挑战!

创造我们的数据集

训练任何机器学习系统,我们都需要训练数据集。破解一个验证码系统,我们则需要训练数据看起来像这样:


由于我们有这个WordPress的验证码插件的源代码,我们可以对它做一些更改,让它保存出10000张验证码图像以及每个图像的正确答案。

花了几分钟时间,在适当地修改源代码并添加一个简单的for后,我得到了一个包含训练数据的文件夹 —— 10000个PNG文件,每个文件都以正确答案作为文件名:


这是唯一我不会给你示例代码的部分。我们这样做是为了教育,我不想让你真的去黑WordPress网站。不过,我会给你我最后生成的这10000张图像,以便你可以重复我的结果。

到目前为止时间过去:5分钟。

简化问题

现在我们有了训练数据,我们可以直接用它来训练神经网络:


有足够的训练数据,这种粗暴的方法甚至也行得通 - 但我们可以使问题更容易解决。问题越简单,训练数据越少,计算资源消耗就越少。毕竟我们只有15分钟!

幸运的是,验证码图像总是由四个字母组成。如果我们能用某种方式把图像分割开来,这样每一个字母都是一个独立的图像,那么我们只需要训练神经网络一次识别一个字母:


我没有时间浏览10000个训练图像,并在Photoshop中手动将它们分割成单独的图像。这将需要几天,而我只剩下10分钟了。

而且我们不能将图像分成四个相同大小的块,因为验证码会将这些字母随机放置在不同的水平位置:


每个图像中的字母随机放置,使分割图像更难一些。

幸运的是,我们仍然可以自动执行此操作。在图像处理中,我们经常需要检测具有相同颜色的像素团。这些连续像素团周围的边界被称为轮廓。OpenCV有一个内置的findContours()函数,可以用来检测这些连续的区域。

那么我们将从一个原始的验证码图像开始:


然后,我们将图像转换为纯黑白(这称为阈值设定),这样就很容易找到连续的区域:


接下来,我们将使用OpenCV的findContours()函数来检测图像中各个包含相同颜色像素的连续团:


那么只需将每个区域保存为一个单独的图像文件即可。而且由于我们知道每个图像应该包含从左到右的四个字母,所以我们可以使用这些知识来标记字母。只要我们按顺序保存它们,我们能够用适当的字母名称保存每个字母图像。

但是等等 —— 我看到一个问题! 有时候验证码有这样的重叠字母:


这意味着我们最终将提取将两个字母拼凑在一起的区域:


如果我们不处理这个问题,我们最终会创建糟糕的训练数据。我们需要解决这个问题,以免我们不小心让机器把这两个相连的字母识别为一个字母。


我们将把任何宽度比高度还长的区域对半分开,并把它当作两个字母。这是很粗暴,但这么处理对识别这些验证码依然行得通。

现在我们有了一种提取单个字母的方法,让我们在所有的CAPTCHA图像上运行它。目标是收集每个字母的不同变化。我们可以将每个字母保存在自己的文件夹中。

下面是我提取所有字母后,我的“W”文件夹的样子:


从我们的10000个验证码图像中提取的一些“W”字母。我一共得到了1147个不同的“W”图像。到目前为止时间过去:10分钟。







请到「今天看啥」查看全文


推荐文章
Python爱好者社区  ·  史上最强!PINN杀疯了
昨天
Python爱好者社区  ·  1885页的Python完全版电子书
3 天前
Python爱好者社区  ·  多模态,杀疯了
2 天前
信海光微天下  ·  “公牛”们来了,互联网公司会颤抖吗?
8 年前
架构师之路  ·  换IP的是你,凭啥重启的却是我?
7 年前
普象工业设计小站  ·  【时尚】选对牛仔裤,粗腿秒变细长直!
7 年前