进阶3·超级课程表核心实现(selenium的使用,验证码识别)


from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import pprint
import time
from selenium.common.exceptions import NoSuchElementException
from lxml import etree
from PIL import Image,ImageEnhance
import pytesseract


def request_url(url):
    # 打开浏览器
    browser_add = r'D:\软件安装地址\360Chrome\Chrome\Application\360chrome.exe'
    chrome_options = Options()
    chrome_options.binary_location = browser_add
    browser = webdriver.Chrome(chrome_options=chrome_options)

    # 打开网址
    browser.get(url)

    # 输入信息:
    number = input("请输入账号:")
    input_name = browser.find_element_by_id("userAccount")   # userAccount:来自元素审查
    input_name.send_keys(number)

    passwd = input("请输入密码:")
    input_pass = browser.find_element_by_id("userPassword")
    input_pass.send_keys(passwd)

#验证码识别

    screenImg = "D:/screenImg.png"
    
    # 获取验证码图片url,并将截图保存本地
    browser.find_element_by_id("SafeCodeImg").get_attribute('src')
    browser.get_screenshot_as_file(screenImg)
    
    # 定位验证码位置及大小
    location = browser.find_element_by_id('SafeCodeImg').location
    size = browser.find_element_by_id('SafeCodeImg').size
    left = location['x'] + 4
    top = location['y']
    right = location['x'] + size['width'] - 115
    bottom = location['y'] + size['height']
    
    # 从本地读取截图,截取验证码位置并处理
    img = Image.open(screenImg).crop((left, top, right, bottom))
    img = img.convert('L')  # 转换模式:L | RGB
    threshold = 127
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    img = img.point(table, '1')
    
    # 保存处理后的图片
    img.save(screenImg)
    
    # 再次读取识别验证码
    img = Image.open(screenImg)
    code = pytesseract.image_to_string(img)
    print(code.strip())

    # 填入验证码
    input_image = browser.find_element_by_id("RANDOMCODE")
    input_image.send_keys(code.strip())
    time.sleep(1)

    # 点击登入
    button = browser.find_element_by_id("btnSubmit")
    button.click()

    # 打开页面至课程表所在的子页面
    button = browser.find_element_by_id("btnSubmit")
    button.click()
    # 打开一级子页面
    browser.switch_to.frame("frmIframe")                       #来着上级页面的源代码Ctrl+F
    time.sleep(5)                                              #程序休停为了页面加载
    classes = browser.find_element_by_class_name("block9")
    classes.click()
    # 打开二级页面
    browser.switch_to.frame("notSession")
    time.sleep(5)
    try:
        browser.find_element_by_xpath("//div[@class='Nsb_layout_l Nsb_l_list']/ul[2]/li/a")
    except NoSuchElementException:
        print("a")
    browser.switch_to.parent_frame()                           #返回上级页面
    classes1 = browser.find_element_by_xpath("//div[@class='Nsb_layout_l Nsb_l_list']/ul[2]/li/a")
    classes1.click()
    # 获取当前页面源代码
    ret = browser.page_source
    return ret


def show(ret):
    html = etree.HTML(ret, parser=etree.HTMLParser(encoding='utf-8'))  # etree获取网页源代码,非本地文档
    a = html.xpath('//div[@class="kbcontent1"]/text()')
    for i in range(30):
        try:
            a.remove('\xa0')
            a.remove('----------------------')
        except ValueError:
            continue
    b = set(a)                                           #建立集合剔除重复元素
    pprint.pprint(b)
    print("总共"+str(len(b))+"门课程")                    #数字直接加字符串会报错

if __name__ == '__main__':
    url = "http://jwxt.qlu.edu.cn/"
    ret=request_url(url)
    show(ret)

结果展示:

课程表信息可以完全获取,因数据整理较麻烦,不再处理


D:\Pycharm-project\venv\Scripts\python.exe D:/Python编程/爬虫/登入.py
 
请输入账号:2017XXXXXX
请输入密码:XXXXXXXXXX
请输入验证码:bbn3
a
{'Matlab及电力系统仿真',
 '个人理财(智慧树)',
 '信号与系统II',
 '复变函数与积分变换',
 '大学体育(4)',
 '形势与政策2',
 '抹茶蛋糕制作工艺研究',
 '数字电子技术',
 '毛泽东思想和中国特色社会主义理论体系概论',
 '电机学',
 '简明电磁场',
 '费斯托木工机械的学习与应用'}
总共12门课程

Process finished with exit code 0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值