Python3 +scrapy爬虫识别验证码(一)字母数字组合验证码识别

感谢做者分享-http://bjbsair.com/2020-04-07/tech-info/30740.htmlhtml

图片验证码基本上是有数字和字母或者数字或者字母组成的字符串,而后经过一些干扰线的绘制而造成图片验证码。app

例如:知网的注册就有图片验证码scrapy

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

首先咱们须要获取验证码图片,经过开发者工具咱们能够获得验证码url连接工具

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

其次就是经过Pillow类库和tesserocr进行识别,代码以下:学习

# -*- coding:utf-8 -*-  
import tesserocr  
from PIL import Image  
import requests  
  
# 经过url连接获取验证码图片,并写入本地文件夹里  
def get_image(path,url):  
    """  
    :param path: 文件夹路径  
    :param url:  验证码url连接  
    """  
    respon = requests.get(url=url)      # 请求验证码url  
    with open(path,"wb") as file:  
        file.write(respon.content)      # 将验证码写到本地  
  
  
# 因为验证码图片过小,须要对验证码图片放大处理,以便识别  
def reset_image_size(image_path):  
    """  
    :param image_path: 图片所在的路径  
    :return:  
    """  
    image = Image.open(fp=image_path)   # 打开图片  
    pic_resize = 5                      # 设置图片放大或者缩小倍数  
    (x, y) = image.size                 # 获取图片的大小  
    x_s = int(x * pic_resize)           # 放大5倍(可调)  
    y_s = int(y * pic_resize)           # 放大5倍(可调)  
    out = image.resize((x_s, y_s), Image.ANTIALIAS)     # ANTIALIAS表示高质量图片  
    out.save(image_path)  
  
  
# 读取验证码图片文本  
def read_image(image_path):  
    """  
    :param image_path: 验证码图片路径  
    :return:  
    """  
    image = Image.open(fp=image_path)       # 打开验证码图片  
    image = image.convert('L')              # 将验证码图片转换为灰度图(L表示灰度图)  
    threshold = 127                         # 设置灰度图二值化阈值  
    table = []  
    for i in range(256):                    # 像素为256  
        if i < threshold:  
            table.append(0)  
        else:  
            table.append(1)  
    image = image.point(table, '1')         # 二值化处理后的副本(1表示二值化)  
    image.show()  
    result = tesserocr.image_to_text(image) # 验证码图片转换为文本  
    return result  
  
  
# 验证码识别信息脏数据处理  
def VerifInfo(result):  
    """  
    :param result: 验证码图片经过初步识别后获得的脏数据  
    :return:  
    """  
    verif_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"  
    verif_list = []  
    for i in result:  
        if i in verif_str:  
            verif_list.append(i)  
    return "".join(verif_list)  
  
  
  
if __name__ == '__main__':  
    img_path = "D:\photo\image"                                 # 文件夹目录  
    img_path = img_path + "\VerificationCode.png"               # 验证码图片所在的目录及名称  
    img_url = "http://my.cnki.net/elibregister/CheckCode.aspx"  # 验证码url  
    get_image(img_path,img_url)                                 # 获取验证码图片  
    reset_image_size(img_path)                                  # 调整验证码图片大小  
    result = read_image(img_path)                               # 读取验证码图片内容  
    verif_info = VerifInfo(result)                              # 验证码内容数据处理  
    verif_len  = len(verif_info)                                # 验证码识别长度  
    if verif_len == 4 and verif_info:  
        print(verif_info)  
    else:  
        pass

最后就是看看识别的效果吧。前者为原始验证码图片,后者是通过二值化处理的图片。url

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

输出的结果为:FZug.net

显然使用tesserocr识别仍是有偏差的,之后能够用深度学习的方式训练处一个模型,能够提升识别效率,后期会跟进实现的。感谢做者分享-http://bjbsair.com/2020-04-07/tech-info/30740.htmlcode

图片验证码基本上是有数字和字母或者数字或者字母组成的字符串,而后经过一些干扰线的绘制而造成图片验证码。htm

例如:知网的注册就有图片验证码blog

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

首先咱们须要获取验证码图片,经过开发者工具咱们能够获得验证码url连接

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

其次就是经过Pillow类库和tesserocr进行识别,代码以下:

# -*- coding:utf-8 -*-  
import tesserocr  
from PIL import Image  
import requests  
  
# 经过url连接获取验证码图片,并写入本地文件夹里  
def get_image(path,url):  
    """  
    :param path: 文件夹路径  
    :param url:  验证码url连接  
    """  
    respon = requests.get(url=url)      # 请求验证码url  
    with open(path,"wb") as file:  
        file.write(respon.content)      # 将验证码写到本地  
  
  
# 因为验证码图片过小,须要对验证码图片放大处理,以便识别  
def reset_image_size(image_path):  
    """  
    :param image_path: 图片所在的路径  
    :return:  
    """  
    image = Image.open(fp=image_path)   # 打开图片  
    pic_resize = 5                      # 设置图片放大或者缩小倍数  
    (x, y) = image.size                 # 获取图片的大小  
    x_s = int(x * pic_resize)           # 放大5倍(可调)  
    y_s = int(y * pic_resize)           # 放大5倍(可调)  
    out = image.resize((x_s, y_s), Image.ANTIALIAS)     # ANTIALIAS表示高质量图片  
    out.save(image_path)  
  
  
# 读取验证码图片文本  
def read_image(image_path):  
    """  
    :param image_path: 验证码图片路径  
    :return:  
    """  
    image = Image.open(fp=image_path)       # 打开验证码图片  
    image = image.convert('L')              # 将验证码图片转换为灰度图(L表示灰度图)  
    threshold = 127                         # 设置灰度图二值化阈值  
    table = []  
    for i in range(256):                    # 像素为256  
        if i < threshold:  
            table.append(0)  
        else:  
            table.append(1)  
    image = image.point(table, '1')         # 二值化处理后的副本(1表示二值化)  
    image.show()  
    result = tesserocr.image_to_text(image) # 验证码图片转换为文本  
    return result  
  
  
# 验证码识别信息脏数据处理  
def VerifInfo(result):  
    """  
    :param result: 验证码图片经过初步识别后获得的脏数据  
    :return:  
    """  
    verif_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"  
    verif_list = []  
    for i in result:  
        if i in verif_str:  
            verif_list.append(i)  
    return "".join(verif_list)  
  
  
  
if __name__ == '__main__':  
    img_path = "D:\photo\image"                                 # 文件夹目录  
    img_path = img_path + "\VerificationCode.png"               # 验证码图片所在的目录及名称  
    img_url = "http://my.cnki.net/elibregister/CheckCode.aspx"  # 验证码url  
    get_image(img_path,img_url)                                 # 获取验证码图片  
    reset_image_size(img_path)                                  # 调整验证码图片大小  
    result = read_image(img_path)                               # 读取验证码图片内容  
    verif_info = VerifInfo(result)                              # 验证码内容数据处理  
    verif_len  = len(verif_info)                                # 验证码识别长度  
    if verif_len == 4 and verif_info:  
        print(verif_info)  
    else:  
        pass

最后就是看看识别的效果吧。前者为原始验证码图片,后者是通过二值化处理的图片。

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

输出的结果为:FZug

显然使用tesserocr识别仍是有偏差的,之后能够用深度学习的方式训练处一个模型,能够提升识别效率,后期会跟进实现的。感谢做者分享-http://bjbsair.com/2020-04-07/tech-info/30740.html

图片验证码基本上是有数字和字母或者数字或者字母组成的字符串,而后经过一些干扰线的绘制而造成图片验证码。

例如:知网的注册就有图片验证码

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

首先咱们须要获取验证码图片,经过开发者工具咱们能够获得验证码url连接

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

其次就是经过Pillow类库和tesserocr进行识别,代码以下:

# -*- coding:utf-8 -*-  
import tesserocr  
from PIL import Image  
import requests  
  
# 经过url连接获取验证码图片,并写入本地文件夹里  
def get_image(path,url):  
    """  
    :param path: 文件夹路径  
    :param url:  验证码url连接  
    """  
    respon = requests.get(url=url)      # 请求验证码url  
    with open(path,"wb") as file:  
        file.write(respon.content)      # 将验证码写到本地  
  
  
# 因为验证码图片过小,须要对验证码图片放大处理,以便识别  
def reset_image_size(image_path):  
    """  
    :param image_path: 图片所在的路径  
    :return:  
    """  
    image = Image.open(fp=image_path)   # 打开图片  
    pic_resize = 5                      # 设置图片放大或者缩小倍数  
    (x, y) = image.size                 # 获取图片的大小  
    x_s = int(x * pic_resize)           # 放大5倍(可调)  
    y_s = int(y * pic_resize)           # 放大5倍(可调)  
    out = image.resize((x_s, y_s), Image.ANTIALIAS)     # ANTIALIAS表示高质量图片  
    out.save(image_path)  
  
  
# 读取验证码图片文本  
def read_image(image_path):  
    """  
    :param image_path: 验证码图片路径  
    :return:  
    """  
    image = Image.open(fp=image_path)       # 打开验证码图片  
    image = image.convert('L')              # 将验证码图片转换为灰度图(L表示灰度图)  
    threshold = 127                         # 设置灰度图二值化阈值  
    table = []  
    for i in range(256):                    # 像素为256  
        if i < threshold:  
            table.append(0)  
        else:  
            table.append(1)  
    image = image.point(table, '1')         # 二值化处理后的副本(1表示二值化)  
    image.show()  
    result = tesserocr.image_to_text(image) # 验证码图片转换为文本  
    return result  
  
  
# 验证码识别信息脏数据处理  
def VerifInfo(result):  
    """  
    :param result: 验证码图片经过初步识别后获得的脏数据  
    :return:  
    """  
    verif_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"  
    verif_list = []  
    for i in result:  
        if i in verif_str:  
            verif_list.append(i)  
    return "".join(verif_list)  
  
  
  
if __name__ == '__main__':  
    img_path = "D:\photo\image"                                 # 文件夹目录  
    img_path = img_path + "\VerificationCode.png"               # 验证码图片所在的目录及名称  
    img_url = "http://my.cnki.net/elibregister/CheckCode.aspx"  # 验证码url  
    get_image(img_path,img_url)                                 # 获取验证码图片  
    reset_image_size(img_path)                                  # 调整验证码图片大小  
    result = read_image(img_path)                               # 读取验证码图片内容  
    verif_info = VerifInfo(result)                              # 验证码内容数据处理  
    verif_len  = len(verif_info)                                # 验证码识别长度  
    if verif_len == 4 and verif_info:  
        print(verif_info)  
    else:  
        pass

最后就是看看识别的效果吧。前者为原始验证码图片,后者是通过二值化处理的图片。

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

输出的结果为:FZug

显然使用tesserocr识别仍是有偏差的,之后能够用深度学习的方式训练处一个模型,能够提升识别效率,后期会跟进实现的。感谢做者分享-http://bjbsair.com/2020-04-07/tech-info/30740.html

图片验证码基本上是有数字和字母或者数字或者字母组成的字符串,而后经过一些干扰线的绘制而造成图片验证码。

例如:知网的注册就有图片验证码

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

首先咱们须要获取验证码图片,经过开发者工具咱们能够获得验证码url连接

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

其次就是经过Pillow类库和tesserocr进行识别,代码以下:

# -*- coding:utf-8 -*-  
import tesserocr  
from PIL import Image  
import requests  
  
# 经过url连接获取验证码图片,并写入本地文件夹里  
def get_image(path,url):  
    """  
    :param path: 文件夹路径  
    :param url:  验证码url连接  
    """  
    respon = requests.get(url=url)      # 请求验证码url  
    with open(path,"wb") as file:  
        file.write(respon.content)      # 将验证码写到本地  
  
  
# 因为验证码图片过小,须要对验证码图片放大处理,以便识别  
def reset_image_size(image_path):  
    """  
    :param image_path: 图片所在的路径  
    :return:  
    """  
    image = Image.open(fp=image_path)   # 打开图片  
    pic_resize = 5                      # 设置图片放大或者缩小倍数  
    (x, y) = image.size                 # 获取图片的大小  
    x_s = int(x * pic_resize)           # 放大5倍(可调)  
    y_s = int(y * pic_resize)           # 放大5倍(可调)  
    out = image.resize((x_s, y_s), Image.ANTIALIAS)     # ANTIALIAS表示高质量图片  
    out.save(image_path)  
  
  
# 读取验证码图片文本  
def read_image(image_path):  
    """  
    :param image_path: 验证码图片路径  
    :return:  
    """  
    image = Image.open(fp=image_path)       # 打开验证码图片  
    image = image.convert('L')              # 将验证码图片转换为灰度图(L表示灰度图)  
    threshold = 127                         # 设置灰度图二值化阈值  
    table = []  
    for i in range(256):                    # 像素为256  
        if i < threshold:  
            table.append(0)  
        else:  
            table.append(1)  
    image = image.point(table, '1')         # 二值化处理后的副本(1表示二值化)  
    image.show()  
    result = tesserocr.image_to_text(image) # 验证码图片转换为文本  
    return result  
  
  
# 验证码识别信息脏数据处理  
def VerifInfo(result):  
    """  
    :param result: 验证码图片经过初步识别后获得的脏数据  
    :return:  
    """  
    verif_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"  
    verif_list = []  
    for i in result:  
        if i in verif_str:  
            verif_list.append(i)  
    return "".join(verif_list)  
  
  
  
if __name__ == '__main__':  
    img_path = "D:\photo\image"                                 # 文件夹目录  
    img_path = img_path + "\VerificationCode.png"               # 验证码图片所在的目录及名称  
    img_url = "http://my.cnki.net/elibregister/CheckCode.aspx"  # 验证码url  
    get_image(img_path,img_url)                                 # 获取验证码图片  
    reset_image_size(img_path)                                  # 调整验证码图片大小  
    result = read_image(img_path)                               # 读取验证码图片内容  
    verif_info = VerifInfo(result)                              # 验证码内容数据处理  
    verif_len  = len(verif_info)                                # 验证码识别长度  
    if verif_len == 4 and verif_info:  
        print(verif_info)  
    else:  
        pass

最后就是看看识别的效果吧。前者为原始验证码图片,后者是通过二值化处理的图片。

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

输出的结果为:FZug

显然使用tesserocr识别仍是有偏差的,之后能够用深度学习的方式训练处一个模型,能够提升识别效率,后期会跟进实现的。感谢做者分享-http://bjbsair.com/2020-04-07/tech-info/30740.html

图片验证码基本上是有数字和字母或者数字或者字母组成的字符串,而后经过一些干扰线的绘制而造成图片验证码。

例如:知网的注册就有图片验证码

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

首先咱们须要获取验证码图片,经过开发者工具咱们能够获得验证码url连接

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

其次就是经过Pillow类库和tesserocr进行识别,代码以下:

# -*- coding:utf-8 -*-  
import tesserocr  
from PIL import Image  
import requests  
  
# 经过url连接获取验证码图片,并写入本地文件夹里  
def get_image(path,url):  
    """  
    :param path: 文件夹路径  
    :param url:  验证码url连接  
    """  
    respon = requests.get(url=url)      # 请求验证码url  
    with open(path,"wb") as file:  
        file.write(respon.content)      # 将验证码写到本地  
  
  
# 因为验证码图片过小,须要对验证码图片放大处理,以便识别  
def reset_image_size(image_path):  
    """  
    :param image_path: 图片所在的路径  
    :return:  
    """  
    image = Image.open(fp=image_path)   # 打开图片  
    pic_resize = 5                      # 设置图片放大或者缩小倍数  
    (x, y) = image.size                 # 获取图片的大小  
    x_s = int(x * pic_resize)           # 放大5倍(可调)  
    y_s = int(y * pic_resize)           # 放大5倍(可调)  
    out = image.resize((x_s, y_s), Image.ANTIALIAS)     # ANTIALIAS表示高质量图片  
    out.save(image_path)  
  
  
# 读取验证码图片文本  
def read_image(image_path):  
    """  
    :param image_path: 验证码图片路径  
    :return:  
    """  
    image = Image.open(fp=image_path)       # 打开验证码图片  
    image = image.convert('L')              # 将验证码图片转换为灰度图(L表示灰度图)  
    threshold = 127                         # 设置灰度图二值化阈值  
    table = []  
    for i in range(256):                    # 像素为256  
        if i < threshold:  
            table.append(0)  
        else:  
            table.append(1)  
    image = image.point(table, '1')         # 二值化处理后的副本(1表示二值化)  
    image.show()  
    result = tesserocr.image_to_text(image) # 验证码图片转换为文本  
    return result  
  
  
# 验证码识别信息脏数据处理  
def VerifInfo(result):  
    """  
    :param result: 验证码图片经过初步识别后获得的脏数据  
    :return:  
    """  
    verif_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"  
    verif_list = []  
    for i in result:  
        if i in verif_str:  
            verif_list.append(i)  
    return "".join(verif_list)  
  
  
  
if __name__ == '__main__':  
    img_path = "D:\photo\image"                                 # 文件夹目录  
    img_path = img_path + "\VerificationCode.png"               # 验证码图片所在的目录及名称  
    img_url = "http://my.cnki.net/elibregister/CheckCode.aspx"  # 验证码url  
    get_image(img_path,img_url)                                 # 获取验证码图片  
    reset_image_size(img_path)                                  # 调整验证码图片大小  
    result = read_image(img_path)                               # 读取验证码图片内容  
    verif_info = VerifInfo(result)                              # 验证码内容数据处理  
    verif_len  = len(verif_info)                                # 验证码识别长度  
    if verif_len == 4 and verif_info:  
        print(verif_info)  
    else:  
        pass

最后就是看看识别的效果吧。前者为原始验证码图片,后者是通过二值化处理的图片。

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

输出的结果为:FZug

显然使用tesserocr识别仍是有偏差的,之后能够用深度学习的方式训练处一个模型,能够提升识别效率,后期会跟进实现的。感谢做者分享-http://bjbsair.com/2020-04-07/tech-info/30740.html

图片验证码基本上是有数字和字母或者数字或者字母组成的字符串,而后经过一些干扰线的绘制而造成图片验证码。

例如:知网的注册就有图片验证码

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

首先咱们须要获取验证码图片,经过开发者工具咱们能够获得验证码url连接

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

其次就是经过Pillow类库和tesserocr进行识别,代码以下:

# -*- coding:utf-8 -*-  
import tesserocr  
from PIL import Image  
import requests  
  
# 经过url连接获取验证码图片,并写入本地文件夹里  
def get_image(path,url):  
    """  
    :param path: 文件夹路径  
    :param url:  验证码url连接  
    """  
    respon = requests.get(url=url)      # 请求验证码url  
    with open(path,"wb") as file:  
        file.write(respon.content)      # 将验证码写到本地  
  
  
# 因为验证码图片过小,须要对验证码图片放大处理,以便识别  
def reset_image_size(image_path):  
    """  
    :param image_path: 图片所在的路径  
    :return:  
    """  
    image = Image.open(fp=image_path)   # 打开图片  
    pic_resize = 5                      # 设置图片放大或者缩小倍数  
    (x, y) = image.size                 # 获取图片的大小  
    x_s = int(x * pic_resize)           # 放大5倍(可调)  
    y_s = int(y * pic_resize)           # 放大5倍(可调)  
    out = image.resize((x_s, y_s), Image.ANTIALIAS)     # ANTIALIAS表示高质量图片  
    out.save(image_path)  
  
  
# 读取验证码图片文本  
def read_image(image_path):  
    """  
    :param image_path: 验证码图片路径  
    :return:  
    """  
    image = Image.open(fp=image_path)       # 打开验证码图片  
    image = image.convert('L')              # 将验证码图片转换为灰度图(L表示灰度图)  
    threshold = 127                         # 设置灰度图二值化阈值  
    table = []  
    for i in range(256):                    # 像素为256  
        if i < threshold:  
            table.append(0)  
        else:  
            table.append(1)  
    image = image.point(table, '1')         # 二值化处理后的副本(1表示二值化)  
    image.show()  
    result = tesserocr.image_to_text(image) # 验证码图片转换为文本  
    return result  
  
  
# 验证码识别信息脏数据处理  
def VerifInfo(result):  
    """  
    :param result: 验证码图片经过初步识别后获得的脏数据  
    :return:  
    """  
    verif_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"  
    verif_list = []  
    for i in result:  
        if i in verif_str:  
            verif_list.append(i)  
    return "".join(verif_list)  
  
  
  
if __name__ == '__main__':  
    img_path = "D:\photo\image"                                 # 文件夹目录  
    img_path = img_path + "\VerificationCode.png"               # 验证码图片所在的目录及名称  
    img_url = "http://my.cnki.net/elibregister/CheckCode.aspx"  # 验证码url  
    get_image(img_path,img_url)                                 # 获取验证码图片  
    reset_image_size(img_path)                                  # 调整验证码图片大小  
    result = read_image(img_path)                               # 读取验证码图片内容  
    verif_info = VerifInfo(result)                              # 验证码内容数据处理  
    verif_len  = len(verif_info)                                # 验证码识别长度  
    if verif_len == 4 and verif_info:  
        print(verif_info)  
    else:  
        pass

最后就是看看识别的效果吧。前者为原始验证码图片,后者是通过二值化处理的图片。

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

Python+scrapy爬虫识别验证码(一)字母数字组合验证码识别

输出的结果为:FZug

显然使用tesserocr识别仍是有偏差的,之后能够用深度学习的方式训练处一个模型,能够提升识别效率,后期会跟进实现的。

相关文章
相关标签/搜索