Python3网络爬虫开发实战
  • Introduction
  • 0-目录
  • 0.0-前言
  • 0.1-序一
  • 0.3-序二
  • 1-开发环境配置
  • 1.1-Python3的安装
  • 1.2-请求库的安装
  • 1.3-解析库的安装
  • 1.4-数据库的安装
  • 1.5-存储库的安装
  • 1.6-Web库的安装
  • 1.7-App爬取相关库的安装
  • 1.8-爬虫框架的安装
  • 1.9-部署相关库的安装
  • 2-爬虫基础
  • 2.1-HTTP基本原理
  • 2.2-Web网页基础
  • 2.3-爬虫基本原理
  • 2.4-会话和Cookies
  • 2.5-代理基本原理
  • 3-基本库的使用
  • 3.1-使用urllib
  • 3.2-使用requests
  • 3.3-正则表达式
  • 3.4-爬取猫眼电影排行
  • 4-解析库的使用
  • 4.1-XPath的使用
  • 4.2-BeautifulSoup的使用
  • 4.3-pyquery的使用
  • 5-数据存储
  • 5.1-文件存储
  • 5.2-关系型数据库存储
  • 5.3-非关系型数据库存储
  • 6-Ajax数据爬取
  • 6.1-什么是Ajax
  • 6.2-Ajax分析方法
  • 6.3-Ajax结果提取
  • 6.4-分析Ajax爬取今日头条街拍美图
  • 7-动态渲染页面抓取
  • 7.1-Selenium的使用
  • 7.2-Splash的使用
  • 7.3-Splash负载均衡配置
  • 7.4-使用Selenium爬取淘宝商品
  • 8-验证码的识别
  • 8.1-图形验证码的识别
  • 8.2-极验滑动验证码识别
  • 8.3-点触验证码识别
  • 8.4-微博宫格验证码识别
  • 9-代理的使用
  • 9.1-代理的设置
  • 9.2-代理池的维护
  • 9.3-付费代理的使用
  • 9.4-ADSL代理的使用
  • 9.5-使用代理爬取微信公众号文章
  • 10-模拟登录
  • 10.1-模拟登录并爬取GitHub
  • 10.2-Cookies池的搭建
  • 11-APP的爬取
  • 11.1-Charles的使用
  • 11.2-mitmproxy的使用
  • 11.3-mitmdump爬取“得到”App电子书信息
  • 11.4-Appium的使用
  • 11.5-Appium爬取微信朋友圈
  • 11.6-Appium+mitmdump爬取京东商品评论
  • 12-pyspider框架的使用
  • 12.1-pyspider框架介绍
  • 12.2-pyspider基本使用
  • 12.3-pyspider用法详解
  • 13-Scrapy框架的使用
  • 13.1-Scrapy框架介绍
  • 13.2-Scrapy入门
  • 13.3-Selector的用法
  • 13.4-Spider的用法
  • 13.5-Downloader Middleware的用法
  • 13.6-Spider Middleware的用法
  • 13.7-Item Pipeline的用法
  • 13.8-Scrapy对接Selenium
  • 13.9-Scrapy对接Splash
  • 13.10-Scrapy通用爬虫
  • 13.11-Scrapyrt的使用
  • 13.12-Scrapy对接Docker
  • 13.13-Scrapy爬取新浪微博
  • 14-分布式爬虫
  • 14.1-分布式爬虫理念
  • 14.2-Scrapy-Redis源码解析
  • 14.3-Scrapy分布式实现
  • 14.4-Bloom Filter的对接
  • 15-分布式爬虫的部署
  • 15.1-Scrapyd分布式部署
  • 15.2-Scrapyd-Client的使用
  • 15.3-Scrapyd对接Docker
  • 15.4-Scrapyd批量部署
  • 15.5-Gerapy分布式管理
Powered by GitBook
On this page
  • 1. 本节目标
  • 2. 准备工作
  • 3. 获取验证码
  • 4. 识别测试
  • 5. 验证码处理
  • 6. 本节代码
  • 7. 结语

Was this helpful?

8.1-图形验证码的识别

Previous8-验证码的识别Next8.2-极验滑动验证码识别

Last updated 5 years ago

Was this helpful?

我们首先识别最简单的一种验证码,即图形验证码。这种验证码最早出现,现在也很常见,一般由 4 位字母或者数字组成。例如,中国知网的注册页面有类似的验证码,链接为:,页面如图 8-1 所示:

图 8-1 知网注册页面

表单的最后一项就是图形验证码,我们必须完全正确输入图中的字符才可以完成注册。

1. 本节目标

以知网的验证码为例,讲解利用 OCR 技术识别图形验证码的方法。

2. 准备工作

识别图形验证码需要库 tesserocr。安装此库可以参考第 1 章的安装说明。

3. 获取验证码

为了便于实验,我们先将验证码的图片保存到本地。

图 8-2 验证码

这样我们就可以得到一张验证码图片,以供测试识别使用。

4. 识别测试

接下来新建一个项目,将验证码图片放到项目根目录下,用 tesserocr 库识别该验证码,代码如下所示:

import tesserocr
from PIL import Image

image = Image.open('code.jpg')
result = tesserocr.image_to_text(image)
print(result)

在这里我们新建了一个 Image 对象,调用了 tesserocr 的 image_to_text() 方法。传入该 Image 对象即可完成识别,实现过程非常简单,结果如下所示:

JR42

另外,tesserocr 还有一个更加简单的方法,这个方法可直接将图片文件转为字符串,代码如下所示:

import tesserocr
print(tesserocr.file_to_text('image.png'))

不过,此种方法的识别效果不如上一种方法好。

5. 验证码处理

接下来我们换一个验证码,将其命名为 code2.jpg,如图 8-3 所示。

图 8-3 验证码

重新用下面的代码来测试:

import tesserocr
from PIL import Image

image = Image.open('code2.jpg')
result = tesserocr.image_to_text(image)
print(result)

可以看到如下输出结果:

FFKT

这次识别和实际结果有偏差,这是因为验证码内的多余线条干扰了图片的识别。

对于这种情况,我们还需要做一下额外的处理,如转灰度、二值化等操作。

我们可以利用 Image 对象的 convert() 方法参数传入 L,即可将图片转化为灰度图像,代码如下所示:

image = image.convert('L')
image.show()

传入 1 即可将图片进行二值化处理,如下所示:

image = image.convert('1')
image.show()

我们还可以指定二值化的阈值。上面的方法采用的是默认阈值 127。不过我们不能直接转化原图,要将原图先转为灰度图像,然后再指定二值化阈值,代码如下所示:

image = image.convert('L')
threshold = 80
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)

image = image.point(table, '1')
image.show()

在这里,变量 threshold 代表二值化阈值,阈值设置为 80。之后我们看看结果,如图 8-4 所示。

图 8-4 处理结果

我们发现原来验证码中的线条已经去除,整个验证码变得黑白分明。这时重新识别验证码,代码如下所示:

import tesserocr
from PIL import Image

image = Image.open('code2.jpg')

image = image.convert('L')
threshold = 127
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)

image = image.point(table, '1')
result = tesserocr.image_to_text(image)
print(result)

即可发现运行结果变成如下所示:

PFRT

那么,针对一些有干扰的图片,我们做一些灰度和二值化处理,这会提高图片识别的正确率。

6. 本节代码

7. 结语

本节我们了解了利用 tesserocr 识别验证码的过程。我们可以直接用简单的图形验证码得到结果,也可以对验证码图片做预处理来提高识别的准确度。

打开开发者工具,找到验证码元素。验证码元素是一张图片,它的 src 属性是 CheckCode.aspx。我们直接打开这个链接 ,就可以看到一个验证码,右键保存即可,将其命名为 code.jpg,如图 8-2 所示。

本节代码地址为:。

http://my.cnki.net/elibregister/CheckCode.aspx
https://github.com/Python3WebSpider/CrackImageCode
http://my.cnki.net/elibregister/commonRegister.aspx