1.使用的库
使用的库:baidu-aip, pillow, selenium.
如果没有安装,可以在cmd中输入:
私信小编01即可获取大量Python学习资料
pip install baidu-aip
pip install pillow
pip install selenium
2.实现功能
(1)账号密码的输入
以上是我校综合服务平台登陆网站的一部分,想要实现自动登陆,账号密码可以通过selenium的
find_element_by_id()
send_keys()
来进行自动输入账号密码。
功能实现代码如下:
account=driver.find_element_by_id('account')
account.send_keys('') #你自己的账号
password=driver.find_element_by_id('password')
password.send_keys('') #你自己的密码
关于element的详细使用方法请参考其他博文
(3) 验证码的获取与识别
验证码的识别请参考我的另一篇文章:
Python通过百度API进行文字识别(baidu-aip)一:简单识别验证码
这里简单描述如何获取二维码。
(一)
首先使用selenium的maxside_window()使得窗口最大化,接着使用save_screenshot()来保存网站截图。
driver=webdriver.Chrome()
driver.maximize_window()
time.sleep(1)
url='https://' #这里填你想要的网站
driver.get(url)
driver.save_screenshot('D:/PYTHON/baidu_ocr/save_screenshot.png') #储存地址可以选你喜欢的(尽量不要有空格和中文,有时会有奇奇怪怪的问题)
(二)
接着获取验证码在网站上具体位置,然后获取验证码的长宽,即可得出验证码的四个点的位置。用crop()函数处理刚刚获取的网站截图,从而获取验证码的图片。
code_ele = driver.find_element_by_id('codeimg')
print("验证码的坐标为:", code_ele.location)
print("验证码的大小为:", code_ele.size)
#验证码的坐标为: {'x': 1723, 'y': 581}
#验证码的大小为: {'height': 48, 'width': 96}
# (4)图片4个点的坐标位置
left = code_ele.location['x']#x点的坐标
top = code_ele.location['y']#y点的坐标
right = code_ele.size['width']+left#上面右边点的坐标
down = code_ele.size['height']+top#下面右边点的坐标
image = Image.open('')
#这里请填你截图所存的地方
code_image=image.crop((left,top,right,down))
code_image.save('D:/PYTHON/baidu_ocr/code_image.png')
(三)
调用百度图片识别API,对储存在本地的二维码进行识别,具体使用方法请见:Python通过百度API进行文字识别(baidu-aip)一:简单识别验证码
APP_ID=''
API_KEY=''
SECRET_KEY=''
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
#读取图片
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
image = get_file_content('D:/PYTHON/baidu_ocr/code_image.png')
# 调用通用文字识别(高精度版) """
code_ocr_original_result=client.basicAccurate(image)
(四)
对百度识图API输出的结果进行处理。
百度API识图输出的格式如下:
{
“log_id”: 2471272194,
“words_result_num”: 2,
“words_result”:
[
{“words”: " TSINGTAO"},
{“words”: “青島睥酒”}
]
}
可以看出“word”的内容是有效的,现在来提取words的内容,代码参考如下:
for text in code_ocr_original_result.get('words_result'):
code_ocr_final_result=text.get('words')
print(text.get('words'))
提取出来的words有时候会含有空格(验证码字符大小不一,百度会将空隙识别成空格)
code_ocr_final_result_with_out=code_ocr_final_result.replace(' ','')
(五)
输入验证码
code_input=driver.find_element_by_id('rancode')
code_input.send_keys(code_ocr_final_result_with_out)
3.代码
from aip import AipOcr
from selenium import webdriver
import time
from PIL import Image
driver=webdriver.Chrome()
driver.maximize_window()
time.sleep(1)
url='https://'
driver.get(url)
driver.save_screenshot('D:/PYTHON/baidu_ocr/save_screenshot.png')
code_ele = driver.find_element_by_id('codeimg')
print("验证码的坐标为:", code_ele.location)
print("验证码的大小为:", code_ele.size)
#验证码的坐标为: {'x': 1723, 'y': 581}
#验证码的大小为: {'height': 48, 'width': 96}
# (4)图片4个点的坐标位置
left = code_ele.location['x']#x点的坐标
top = code_ele.location['y']#y点的坐标
right = code_ele.size['width']+left#上面右边点的坐标
down = code_ele.size['height']+top#下面右边点的坐标
image = Image.open('D:/PYTHON/baidu_ocr/save_screenshot.png')
code_image=image.crop((left,top,right,down))
code_image.save('D:/PYTHON/baidu_ocr/code_image.png')
APP_ID=''
API_KEY=''
SECRET_KEY=''
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
#读取图片
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
image = get_file_content('D:/PYTHON/baidu_ocr/code_image.png')
# 调用通用文字识别(高精度版) """
code_ocr_original_result=client.basicAccurate(image)
print('code ocr original result:')
print(code_ocr_original_result)
print('final code result:')
for text in code_ocr_original_result.get('words_result'):
code_ocr_final_result=text.get('words')
print(text.get('words'))
code_ocr_final_result_with_out=code_ocr_final_result.replace(' ','')
account=driver.find_element_by_id('account')
account.send_keys('')
password=driver.find_element_by_id('password')
password.send_keys('')
code_input=driver.find_element_by_id('rancode')
code_input.send_keys(code_ocr_final_result_with_out)
code_input.submit()
time.sleep(10)
end=input('press any key to go out')
在利用了百度高精度文字识别api后,验证码的识别成功率大大提高,成功率大约在70%左右,还是不错的。本自动登陆仅用于学习之用。