Python爬虫——如何解决图形验证问题?

Python爬虫——图形验证码

  • 1.Tesseract简介
  • 2.在python使用tesseract识别图像
  • 3.使用pytesseract处理图像验证码
  • 4.打码云平台

1.Tesseract简介

在爬虫与反爬的技术进化过程中,产生了一种我们(“spider-man”)常见的却难以解决的问题——图形验证,这些验证常见于登录或者请求时。为了解决这个问题,我们在这里采用的是将图形翻译成文字的技术,即光学文字识别(Optical Character Recognition),简称OCR。由于这部分存在技术壁垒(需要大量的数据、算法、机器学习、深度学习知识等)与极高的商业价值,使得实现OCR的库(特别是开源)并不是很多。这里主要介绍的一个较为优秀的图像识别开源库:Tesseract。

  • Tesseract是一个将图像翻译成文字的OCR库,目前由谷歌赞助。它是目前公认最优秀且准确的开源OCR库。Tesseract具有很高的识别度,也具有很高的灵活性,且它可以通过训练识别任何字体
  • Windows系统安装:可以在这里进行下载
    在Python中调用Tesseract:
pip install pytesseract
  • 设置环境变量
    安装完成后,如果想要在命令行中使用Tesseract,那么应该设置环境变量
    Mac和Linux在安装时就默认设置好了,而在Windows下需要把tesseract.exe所在的路径添加到Path环境变量中。
    步骤:我的电脑——属性——高级系统设置——环境变量——在Path中添加tesseract.exe的路径
  • 此外,还需要把训练的数据文件的路径放在环境变量中。
    步骤:前面和以上步骤一样,最后一步新建一个环境变量,需要设置tessdata的所在路径
    Python爬虫——如何解决图形验证问题?_第1张图片
    当设置完成后我们如何查看是否安装成功呢?
    这时我们需要进入命令提示符窗口,并输入tesseract --version查看版本,正常运行则表示安装成功
    Python爬虫——如何解决图形验证问题?_第2张图片
  • 在命令行中使用tesseract
    语法:tesseract 图片路径 文件路径
    例如:tesseract demo.png demo

2.在python使用tesseract识别图像

import pytesseract
from PIL import Image

# 指定tesseract驱动的路径和数据包的路径
pytesseract.pytesseract.tesseract_cmd = r'D:\Tesseract\Tesseract-OCR\tesseract.exe'
tessdata_dir_config = r'"D:\Tesseract\Tesseract-OCR\tessdata"'

# 打开图片    open里面为图片路径
image = Image.open(r'C:\Users\lenovo\Desktop\1.png')

# 识别结果  第一个参数是图片  第二个参数是语言  第三个参数是训练包的配置
print(pytesseract.image_to_string(image,lang='eng',config=tessdata_dir_config))

3.使用pytesseract处理图像验证码

  • 使用的图像验证码URL在这里,每刷新一次,图像验证码都会发生变化
  • 话不多说,上代码
import pytesseract
from PIL import Image
import requests

# 获取网页验证码  --这里的验证码就是整个网页,所以使用content即可--
URL = 'https://passport.lagou.com/vcode/create?from=register&refresh=1513081451891'
response = requests.get(URL)
with open('test.png', 'wb') as f:
    f.write(response.content)

# 翻译验证码
pytesseract.pytesseract.tesseract_cmd = r'D:\Tesseract\Tesseract-OCR\tesseract.exe'
tessdata_dir_config = r'"D:\Tesseract\Tesseract-OCR\tessdata"'
image = Image.open('test.png')

print('识别结果为:')
print(pytesseract.image_to_string(image,lang='eng',config=tessdata_dir_config))

结果展示:

  • 图像验证码:
    Python爬虫——如何解决图形验证问题?_第3张图片
  • 结果:
    在这里插入图片描述
    看得出结果错了。。。。。虽然这只是一次实验结果。。实际上,这种方法需要验证很多次才能完全正确一次。当然开源的能做到这样已经非常不错了,接下来我们来看看付费的吧(没有打广告,给了钱的效果确实好太多了)。

4.打码云平台

开发文档:

import json
import requests
import base64
from io import BytesIO
from PIL import Image
from sys import version_info


def base64_api(uname, pwd,  img):
    img = img.convert('RGB')
    buffered = BytesIO()
    img.save(buffered, format="JPEG")
    if version_info.major >= 3:
        b64 = str(base64.b64encode(buffered.getvalue()), encoding='utf-8')
    else:
        b64 = str(base64.b64encode(buffered.getvalue()))
    data = {
     "username": uname, "password": pwd, "image": b64}
    result = json.loads(requests.post("http://api.ttshitu.com/base64", json=data).text)
    if result['success']:
        return result["data"]["result"]
    else:
        return result["message"]
    return ""


if __name__ == "__main__":
    img_path = "C:/Users/Administrator/Desktop/file.jpg"
    img = Image.open(img_path)
    result = base64_api(uname='你的账号', pwd='你的密码', img=img)
    print('识别结果如下:')
    print(result)

结果展示:
Python爬虫——如何解决图形验证问题?_第4张图片
pytesseract:
在这里插入图片描述
打码云平台:
在这里插入图片描述

嗯。。。。。可能看出来了,给钱的还是厉害点,真香。

你可能感兴趣的:(图像识别,python)