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中(系统环境变量中)