f、识别验证码

1、Tesseract安装与简介

阻碍我们爬虫的。有时候正是在登录或者请求一些数据时候的图形验证码。因此这里我们讲解一种能将图片翻译成文字的技术。将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition),简写为OCR。实现OCR的库不是很多,特别是开源的。因为这块存在一定的技术壁垒(需要大量的数据、算法、机器学习、深度学习知识等),并且如果做好了具有很高的商业价值。因此开源的比较少。这里介绍一个比较优秀的图像识别开源库:Tesseract。
Tesseract是一个将图像翻译成文字的OCR(光学文字识别,Optical Character Recognition),目前由谷歌赞助。Tesseract是目前公认最优秀、最准确的开源OCR库。Tesseract具有很高的识别度,也具有很高的灵活性,他可以通过训练识别任何字体
Windows系统安装 在以下链接下载可执行文件

pip install pytesseract#在python中使用要导入该库
1

安装完成后,如果想要在命令行中使用Tesseract,那么应该设置环境变量。Mac和Linux在安装的时候就默认已经设置好了。在Windows下把tesseract.exe所在的路径添加到PATH环境变量中。
还有一个环境变量需要设置的是,要把训练的数据文件路径也放到环境变量中。 在环境变量中,添加一个TESSDATA_PREFIX=D:\Tesseract-OCR\tessdata

2、在代码中使用tesseract

# import pytesseract
# # from PIL import Image #PIL pillow python imaging libray(图像处理库,目前已经停止更新维护了)
# # # 指定Tesseract的安装路径和数据包的路径
# # pytesseract.pytesseract.tesseract_cmd = r'F:\Tesseract-OCR\tesseract.exe'
# # tessdata_dir_config = r'--tessdata-dir "F:\Tesseract-OCR\tessdata"'
# # image = Image.open('demo.jpg')
# # print(pytesseract.image_to_string(image, lang='eng',  config=tessdata_dir_config))
1234567

3、用pytesseract处理图形验证码

from urllib import request
import pytesseract
from PIL import Image
import time

pytesseract.pytesseract.tesseract_cmd = r'F:\Tesseract-OCR\tesseract.exe'
tessdata_dir_config = r'--tessdata-dir "F:\Tesseract-OCR\tessdata"'
url = 'https://passport.lagou.com/vcode/create?from=register&refresh=1513081451891'
while True:
    request.urlretrieve(url,'code.png')
    image = Image.open('code.png')
    time.sleep(2)
    print(pytesseract.image_to_string(image, lang='eng', config=tessdata_dir_config))

1234567891011121314

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 = "code.png"
    img = Image.open(img_path)
    result = base64_api(uname='', pwd='', img=img)
    print(result)
12345678910111213141516171819202122232425262728

5、验证码获取的时候不与页面同步的解决办法

5.1模拟登录

通过selenium自动化测试工具自动定位将用户名和密码输入后进入验证码的识别

5.2验证码的获取(重点在于解决验证码同步避免两次请求)

通过截屏将整页截图,再通过定位控件的位置以及crop函数截取想要的验证码区域

pic = driver.find_element_by_id('Image1')
location = pic.location
size = pic.size
# 左上右下四元组坐标
coordinates = (
    int(location['x']), int(location['y']), int(location['x'] + size['width']), int(location['y'] + size['height']))
driver.save_screenshot('test.png')
i = Image.open('test.png')
verfiy_pic = i.crop(coordinates)  
verfiy_pic.save('验证码.png')  # 将同步的验证码保存到本地
12345678910

5.3验证码的识别

①通过OCR图片识别借助图鉴第三方打码平台识别(识别能力稍强,付费很便宜1块钱可以用几千次,也可能几百次反正很实惠,识别能力比②强)图鉴网站点击查看详情
②(借助tesseract识别参考)(识别能力弱一点免费)
接下来以第一种识别为例,账号自备

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 = "demo.jpg"
    img = Image.open(img_path)
    result = base64_api(uname='', pwd='', img=img)
    print(result)
12345678910111213141516171819202122232425262728

6、如何批量导入导出python库

①导出:pip freeze > C:\Users\Administrator\Desktop\1.txt
会在桌面生成一个txt文件里面有安装过的所有python第三方库
在这里插入图片描述
②导入:pip install -r C:\Users\Administrator\Desktop\1.txt
输入命令回车后文件中的所有库都会导入到site-package中(系统环境变量中)

posted @ 2021-03-31 07:36  昵称已经被使用  阅读(148)  评论(0)    收藏  举报