20224202 2023-2024-2 《Python程序设计》实验4 Python综合实践

20224202曹涵桐 2024-05-30 19:26:48

20224202 2023-2024-2 《Python程序设计》实验4 Python综合实践

课程:《Python程序设计》
班级: 2242
姓名: 曹涵桐
学号:20224202
实验教师:王志强
实验日期:2024年5月27日
必修/选修: 专选课
实验四 综合实践

1.实验内容

我们在校园内登录校园网时非常的不方便,每次需要手动填写账号密码以及输入验证码,在课程中学习了爬虫的相关知识以及通过csdn自学及请教计算机专业的同学后,编写出了利用selenium模块,实现校园网自动认证登录的代码

2.实验过程及结果


主代码
![此处填写实验的过程及结果](

import time

import ddddocr
from selenium import webdriver
from selenium.common import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def login(username, pwd):
    # 启动Edge
    driver = webdriver.Edge()
    driver.get(
        'https://192.168.200.127:8445/PortalServer/customize/1606381611261/pc/auth.jsp?ssid=edu%'
        '5Fclassroom&url=http%3A%2F%2Fedge%2Dhttp%2Emicrosoft%2Ecom%2Fcaptiveportal%2Fgenerate%5F'
        '204&authSuccess=2&redirectUrl=&urlParameter=http://edge-http.microsoft.com/captiveportal'
        '/generate_204&currentTime=1715407553151')
    while 1:
        time.sleep(1)
        all_windows = driver.window_handles
        for window in all_windows:
            driver.switch_to.window(window)
            print(driver.title)
            if driver.title == '隐私错误':
                body = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID, 'body')))
                body.send_keys('thisisunsafe')
                element_name = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID, 'username')))
                element_name.send_keys(username)
                element_password = driver.find_element(By.ID, '_password')
                ActionChains(driver).send_keys_to_element(element_password, pwd).perform()

                box = driver.find_element(By.ID, 'agreeCheck')
                box.click()

                while 1:
                    verify = driver.find_element(By.ID, 'validCodeImg')
                    verify.screenshot('ver.png')
                    code = driver.find_element(By.ID, 'validCode')
                    ocr = ddddocr.DdddOcr()
                    image = open('ver.png', 'rb').read()
                    text = ocr.classification(image)
                    code.clear()
                    code.send_keys(text)
                    button = driver.find_element(By.ID, 'loginBtn')
                    button.click()
                    try:
                        check = WebDriverWait(driver, 3, 0.5).until(
                            EC.presence_of_element_located((By.CLASS_NAME, "btn-wrapper")))
                    except TimeoutException:
                        driver.quit()
                    check.click()
                    continue


if __name__ == '__main__':
    try:
        file = open('information.txt', 'r')
    except FileNotFoundError:
        with open('information.txt', 'w+') as file:
            name = input("输入您的账号名称:")
            password = input("输入您的密码:")
            file.write(name + '\n')
            file.write(password)
            file.close()
    finally:
        file = open('information.txt', 'r')
        username = file.readline()
        pwd = file.readline()
        login(username, pwd)

)
 

前期准备:我们先要下载ddddocr以及selenium这两个环境,点击win+r键,键入cmd,输入pip install ddddocr以及pip install selenium,等待后即可完成下载。下载过程见下图所示

 

接下来开始编写代码,过程如下:

  1. 导入必要的库

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import time
    import ddddocr
    

    这些库包括 Selenium 库(用于浏览器自动化),time 模块(用于等待操作),和 ddddocr 库(用于验证码识别)。

  2. 启动 Edge 浏览器并访问目标 URL

    driver = webdriver.Edge()
    driver.get('https://192.168.200.127:8445/PortalServer/customize/1606381611261/pc/auth.jsp?...')
    

    使用 webdriver.Edge() 启动 Edge 浏览器,并通过 driver.get() 方法访问指定的 URL。

  3. 循环检查浏览器窗口

    while 1:
        time.sleep(1)
        all_windows = driver.window_handles
        for window in all_windows:
            driver.switch_to.window(window)
            print(driver.title)
            if driver.title == '隐私错误':
                ...
    

    通过一个无限循环 (while 1:) 不断检查当前所有打开的浏览器窗口,并切换到每个窗口。如果窗口标题是“隐私错误”,则进行处理。

  4. 处理“隐私错误”页面

    body = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, 'body')))
    body.send_keys('thisisunsafe')
    

    如果出现“隐私错误”页面,程序会等待 body 元素出现,然后输入 thisisunsafe,跳过浏览器的安全警告。

  5. 填写登录表单

    element_name = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, 'username')))
    element_name.send_keys(username)
    element_password = driver.find_element(By.ID, '_password')
    ActionChains(driver).send_keys_to_element(element_password, pwd).perform()
    

    程序等待 username 和 password 输入框出现,并分别输入用户名和密码。

  6. 同意协议并处理验证码

    box = driver.find_element(By.ID, 'agreeCheck')
    box.click()
    
    while 1:
        verify = driver.find_element(By.ID, 'validCodeImg')
        verify.screenshot('ver.png')
        code = driver.find_element(By.ID, 'validCode')
        ocr = ddddocr.DdddOcr()
        image = open('ver.png', 'rb').read()
        text = ocr.classification(image)
        code.clear()
        code.send_keys(text)
        button = driver.find_element(By.ID, 'loginBtn')
        button.click()
        try:
            check = WebDriverWait(driver, 3, 0.5).until(
                EC.presence_of_element_located((By.CLASS_NAME, "btn-wrapper")))
        except TimeoutException:
            driver.quit()
        check.click()
        continue
    

    勾选同意协议,然后在一个无限循环中处理验证码。使用 ddddocr 库识别验证码并填写,再点击登录按钮。如果登录成功,则退出循环。

  7. 读取用户信息

    if __name__ == '__main__':
        try:
            file = open('information.txt', 'r')
        except FileNotFoundError:
            with open('information.txt', 'w+') as file:
                name = input("输入您的账号名称:")
                password = input("输入您的密码:")
                file.write(name + '\n')
                file.write(password)
                file.close()
        finally:
            file = open('information.txt', 'r')
            username = file.readline()
            pwd = file.readline()
            login(username, pwd)
    

    主函数中,程序首先尝试读取 information.txt 文件获取用户名和密码。如果文件不存在,则提示用户输入账号名称和密码,并保存到文件中。然后读取文件中的用户名和密码,调用 login 函数进行登录操作。根据selenium这一模拟化网页操作库,可以更加直观且更容易找到错误点。

实验成果展示:

ps:由于我忘记了我校园网的登陆密码,最后使用的是我舍友20224222马铭泽同学的账号和密码进行测试,感谢他的奉献

输入账号和密码(为保护隐私已打码)

 

点击回车,则会自动打开edge并且输入完成账号密码验证码,显示可以上网

 

 

验证码识别的流程先是对验证码元素截图,再通过ddddocr库对其进行识别,得到验证码,最后根据这个验证码得到最终答案

 

3.本次实验遇到的问题以及感悟


问题1:页面跳转后产生异常报错
问题1解决方案:结合driver.title获取标签名与目标名的比较,来判断是否是目标网页,是该网页在进行该网页的元素定位
问题2:验证码无法识别
问题2解决方案:几次寻找找到了ddddocr这个模块,结合selenium的screenshot函数,得到验证码的图片,进而识别得到验证码
问题3:有时候识别不成功,或者网络存在延迟,导致元素无法定位或者没有成功验证就退出
问题3解决方案:研究selenium的等待方式,实现了元素到再开始的方式,避免了错误的发生

问题4:选择一位同学的学号姓名输入后,再次运行时自动跳转,没办法输入其他人的

问题4解决方案:将左侧名称为information的文档删除,即可解决问题

 

 

 

 

本次实验非常考验我们的综合能力,在这个实验中,我首次接触了Selenium库,这是一个非常强大的工具,可以用来自动化网页操作。通过它,我可以控制浏览器打开网页、填写表单、点击按钮等,感觉就像在用Python代码操控浏览器,非常有趣。自动化填写表单部分让我熟悉了元素定位和输入操作。特别是验证码识别部分,我使用ddddocr库来自动识别验证码并填写,这部分内容让我了解了图像处理和光学字符识别(OCR)技术的基本应用。我了解到原来我们上课讲的知识只是整个python的冰山一角,如果想全部掌握可能需要极大的兴趣和努力(不知道以后还会不会接触python)。

5.课程感悟

这学期最大的惊喜无非学到了一门计算机语言,作为文科生的我最开始比较不情愿地选了这门课,因为我觉得学起来会非常困难且会占用很多时间,在上了几次课后,发现0基础学习python没有想象中的那么困难艰辛,强哥对我们也非常的好,上课很有耐心,不难为我们也不因为我们没答上来一些简单的问题而生气,在三次实验中可以明显地感觉到自己在慢慢掌握这门语言,也在慢慢进步,实验做得一次比一次得心应手,在本次实验也是综合实验中我体会到了python的实际价值与快乐,通过自己编写的代码就可以实验自动连接校园网,以后不用再一遍遍地进行输入,特别方便!而且学习了一些课外的知识比如ddddocr验证系统,了解到原来我们平时那些图片验证码就是以这个作为基础的,进一步激发了我的兴趣。再次感谢强哥一个学期的悉心教导,希望在以后两年的生活里能够多多约球!

## 参考资料
1.[selenium的三种等待方式](https://blog.csdn.net/qq_44728587/article/details/122997412)
2.[Selenium异常处理](https://blog.csdn.net/u013114480/article/details/108170563)
3.[selenium获取元素信息的常用方法](https://blog.csdn.net/omaidb/article/details/118162174)
4.[selenium切换窗口的几种方法小结](https://blog.csdn.net/daiyu__zz/article/details/86175177)
5.[Python OCR库:自动化验证码识别神器!](https://blog.csdn.net/m0_59596937/article/details/132797297)
 

...全文
194 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

93

社区成员

发帖
与我相关
我的任务
社区描述
Python程序设计作业
软件构建 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧