在爬虫与反爬的技术进化过程中,产生了一种我们(“spider-man”)常见的却难以解决的问题——图形验证,这些验证常见于登录或者请求时。为了解决这个问题,我们在这里采用的是将图形翻译成文字的技术,即光学文字识别(Optical Character Recognition),简称OCR。由于这部分存在技术壁垒(需要大量的数据、算法、机器学习、深度学习知识等)与极高的商业价值,使得实现OCR的库(特别是开源)并不是很多。这里主要介绍的一个较为优秀的图像识别开源库:Tesseract。
pip install pytesseract
tesseract demo.png demo
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))
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))
结果展示:
开发文档:
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)
嗯。。。。。可能看出来了,给钱的还是厉害点,真香。