93
社区成员




课程:《Python程序设计》
班级: 2242
姓名: 曹涵桐
学号:20224202
实验教师:王志强
实验日期:2024年5月27日
必修/选修: 专选课
实验四 综合实践
我们在校园内登录校园网时非常的不方便,每次需要手动填写账号密码以及输入验证码,在课程中学习了爬虫的相关知识以及通过csdn自学及请教计算机专业的同学后,编写出了利用selenium模块,实现校园网自动认证登录的代码
主代码
: # 启动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¤tTime=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,等待后即可完成下载。下载过程见下图所示
接下来开始编写代码,过程如下:
导入必要的库:
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
库(用于验证码识别)。
启动 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。
循环检查浏览器窗口:
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:
) 不断检查当前所有打开的浏览器窗口,并切换到每个窗口。如果窗口标题是“隐私错误”,则进行处理。
处理“隐私错误”页面:
body = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, 'body')))
body.send_keys('thisisunsafe')
如果出现“隐私错误”页面,程序会等待 body
元素出现,然后输入 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()
程序等待 username
和 password
输入框出现,并分别输入用户名和密码。
同意协议并处理验证码:
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
库识别验证码并填写,再点击登录按钮。如果登录成功,则退出循环。
读取用户信息:
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库对其进行识别,得到验证码,最后根据这个验证码得到最终答案
问题1:页面跳转后产生异常报错
问题1解决方案:结合driver.title获取标签名与目标名的比较,来判断是否是目标网页,是该网页在进行该网页的元素定位
问题2:验证码无法识别
问题2解决方案:几次寻找找到了ddddocr这个模块,结合selenium的screenshot函数,得到验证码的图片,进而识别得到验证码
问题3:有时候识别不成功,或者网络存在延迟,导致元素无法定位或者没有成功验证就退出
问题3解决方案:研究selenium的等待方式,实现了元素到再开始的方式,避免了错误的发生
问题4:选择一位同学的学号姓名输入后,再次运行时自动跳转,没办法输入其他人的
问题4解决方案:将左侧名称为information的文档删除,即可解决问题
本次实验非常考验我们的综合能力,在这个实验中,我首次接触了Selenium库,这是一个非常强大的工具,可以用来自动化网页操作。通过它,我可以控制浏览器打开网页、填写表单、点击按钮等,感觉就像在用Python代码操控浏览器,非常有趣。自动化填写表单部分让我熟悉了元素定位和输入操作。特别是验证码识别部分,我使用ddddocr库来自动识别验证码并填写,这部分内容让我了解了图像处理和光学字符识别(OCR)技术的基本应用。我了解到原来我们上课讲的知识只是整个python的冰山一角,如果想全部掌握可能需要极大的兴趣和努力(不知道以后还会不会接触python)。
这学期最大的惊喜无非学到了一门计算机语言,作为文科生的我最开始比较不情愿地选了这门课,因为我觉得学起来会非常困难且会占用很多时间,在上了几次课后,发现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)