【python+selenium】自动登陆学校青果教务网

前两天学爬虫,发现了selenium自动化测试库,突发奇想可以用这个库来自动登陆学校教务网。

selenium库的安装教程百度有很多,大概就是pip install selenium,安装Chromedriver或者Firefoxdriver,再添加环境变量。

这里主要使用Webdriver库

这个程序里用到的Webdriver的方法有:

webdriver.Chrome() :调用chrome浏览器;
get_screenshot_as_file(path)   :将当前页面截图保存到path地址;
maximize_window() :最大化窗口;
get(url) :打开url网页;
find_element_by_xpath(xpath) :搜索页面源码中的xpath元素;
click() :模拟鼠标点击;
switch_to.frame('frmHomeShow') :切换框架到frmHomeShow;
send_keys(str(std_num)) : 模拟键盘将str(std_num)值送到文中输入框;
current_url : 输出当前网页的url;

大致思路:用Webdriver模拟浏览器打开网页,模拟点击,输送学号,密码,将网页截图,用Pillow中的Image库将截图中的验证码单独截取下来,再用百度文字识别验证码,送到网页中。

from selenium import webdriver
from aip import AipOcr
from PIL import Image
import time
import os
import re


url= r'http://xk.csust.edu.cn/'
p_path1=r"D:\test1.png"
p_path2=r"D:\test2.png"

def DownValidataCode(p_path1,p_path2):    #获取验证码图片
    time.sleep(3)
    drive.get_screenshot_as_file(p_path1)  #网页截图
    img = Image.open(p_path1)              #利用Image库将验证码截取
    box = (307, 339, 428, 391)             #通过Photoshop可以看到验证码的像素区域范围
    im = img.crop(box)                     #截取
    im.save(p_path2)                       #保存到本地

def GetValidateCode(p_path):               #百度识别验证码,根据百度开发文档写
    APP_ID = 'xxxxx'
    API_KEY = 'xxxxxxx'
    SECRET_KEY = 'xxxxxx'
    client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
    f= open(p_path,'rb')
    img= f.read()
    f.close()
    a= client.webImage(img)                #返回的是一个json
    word= re.search(r'\'words\': \'(.*?)\'',str(a))
    code=word.group(0).split('\'')
    return code[-2]                        #找到验证码并返回

def PicDelete(p_path1,p_path2):            #删除保存在本地的验证码
    os.remove(p_path1)
    os.remove(p_path2)

print("请确保学号和密码输入正确!!!")
std_num= input("请输入学号:")
password= input("请输入密码:")

drive= webdriver.Chrome()
drive.maximize_window()
drive.get(url)
time.sleep(3)
drive.find_element_by_xpath("//*[@id='m14']").click()
drive.switch_to.frame('frmHomeShow')
drive.find_element_by_xpath("//*[@id='txt_asmcdefsddsd']").send_keys(str(std_num))

succes= 0
while(succes==0):               #循环,因为百度识别率太低,经常验证码错误,循环到直至成功为止
    drive.find_element_by_id("txt_pewerwedsdfsdff").send_keys(str(password))
    drive.find_element_by_id("txt_sdertfgsadscxcadsads").click()
    DownValidataCode(p_path1,p_path2)
    a= GetValidateCode(p_path2)
    print(a)
    drive.find_element_by_id("txt_sdertfgsadscxcadsads").send_keys(a)
    drive.find_element_by_xpath("//*[@id='divThePanel']/tbody/tr/td/table/tbody/tr[5]/td[2]/input[1]").click()
    time.sleep(5)
    if drive.current_url != "http://xk.csust.edu.cn/": 
                            #不知道怎么捕捉验证码错误异常,通过网页地址判断是否登陆成功
        succes = 1

time.sleep(3)
PicDelete(p_path1,p_path2)
os.system("pause")
#drive.close()

xpath的获取方式可以用chrome的开发者工具:

【python+selenium】自动登陆学校青果教务网_第1张图片

虽然这方法有点蠢,直接用cookies登陆快多了,但是练练手还是可以的。 

这样就写完了,下一篇博客写如何用pyinstaller将这个.py文件封装成exe可执行文件,直接双击就能运行。

持续更新python相关学习过程,欢迎关注,指教。

你可能感兴趣的:(【python+selenium】自动登陆学校青果教务网)