本文仅适用于华中大网上选课系统的公选课改选“截胡”,效果是在电脑上实现自动查询所需课程是否满员,若未满则自动点击选课,最好不要挂后台也不要让电脑自动熄屏,手机上不能运行。驱动器是edge浏览器,大多数电脑应该都有。
时间紧急,废话不多说。首先保证自己有python的IDE,已经完成python环境配置,本人的python版本3.10.9,使用命令 pip install selenium
即可安装 selenium
库,本人的selenium版本为4.9.1。4以上版本应该都行。
在电脑中查找edge的安装位置,双击点开,在Application文件夹里找到msedge.exe,窗口保留不动,后面需要复制msedge.exe的文件地址。
随后在桌面上新建txt文件,将以下代码复制进去,并将代码中cd和--remote之间的地址修改为msedge.exe的文件地址(单击选中msedge.exe右键并选择“复制文件地址”),然后将msedge.exe前的“\”改为回车,应得到两行代码
cd C:\Program Files (x86)\Microsoft\Edge\Application
msedge.exe --remote-debugging-port=10250 --user-data-dir="D:\seleniumEdge"
保存该txt文件,并重命名为my_Edge.cmd(关键是将txt的后缀名修改为cmd)
双击该cmd文件可执行,并弹出一个和初始化后的edge浏览器差不多的界面则准备工作完成。(不会影响原来浏览器的数据)
打开VScode(或者pycharm等),新建一个工程文件,并在目录中新建一个.py文件,将以下代码复制进去,自行命名。
"""
这是让selenium链接已存在浏览器解决登录问题的py文件
"""
from selenium.webdriver import Edge
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 用于选择登录端口
from selenium.webdriver.edge.options import Options
def driver_on_edge():
"""
建立已存在的浏览器连接
:return: driver on edge
"""
# 造浏览器配置对象
edge_op = Options()
# 配置浏览器
# "127.0.0.1:10250"其中,10250是浏览器的运行端口
edge_op.add_experimental_option("debuggerAddress", "127.0.0.1:10250")
# 让浏览器带着这个配置运行
return Edge(options=edge_op)
if __name__ == '__main__':
driver = driver_on_edge()
# def connect_to_existing_edge_browser():
# """
# 建立已存在的 Edge 浏览器连接。
# :return: Edge 浏览器驱动程序对象
# """
# # 创建 Edge 浏览器配置对象
# edge_options = Options()
# # 配置调试器地址
# # "127.0.0.1:10250" 其中,10250 是浏览器的调试器端口
# edge_options.add_experimental_option("debuggerAddress", "127.0.0.1:10250")
# # 创建 DesiredCapabilities 对象,并设置浏览器选项
# desired_capabilities = desired_capabilities.EDGE.copy()
# desired_capabilities["ms:edgeOptions"] = edge_options.to_capabilities()["ms:edgeOptions"]
# # 使用 DesiredCapabilities 对象创建 Edge 浏览器驱动程序对象
# return Edge(desired_capabilities=desired_capabilities)
# if __name__ == '__main__':
# # 建立已存在的 Edge 浏览器连接
# driver = connect_to_existing_edge_browser()
再在同一目录中新建一个.py文件,将以下代码复制进去,保存,自行命名。
from selenium.webdriver import Edge
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.edge.options import Options
# 链接已存在浏览器
import time
import edge_on_selenium
driver = edge_on_selenium.driver_on_edge()
number_default = '28/28'#事先确定好备选课程满员时的人数默认值,并替换掉28/28
time.sleep(0.5)
i = 0
driver.refresh()
while 1:
i += 1
# 转到iframe中
frame = driver.find_elements(by=By.TAG_NAME, value='iframe')
driver.switch_to.default_content()
driver.switch_to.frame(frame[0])
time.sleep(0.5)
# 点击选课
button0 = driver.find_element(by=By.XPATH, value='/html/body/div/ul/li[1]/a/span')
button0.click()
driver.switch_to.default_content()
time.sleep(0.5)
driver.switch_to.frame(frame[1])
# 点击下一步
button1 = driver.find_element(by=By.XPATH, value='/html/body/form/div/div[2]/div/input')
button1.click()
time.sleep(0.5)
driver.switch_to.frame(driver.find_elements(by=By.TAG_NAME, value='iframe')[0])
# 输入课程名
label = driver.find_element(by=By.XPATH, value='/html/body/div/table/tbody/tr[1]/td/form[1]/input[2]').send_keys(
'钢琴初级班')#请用自己备选的课程名替换掉钢琴初级班
search = driver.find_element(by=By.XPATH, value='/html/body/div/table/tbody/tr[1]/td/form[1]/input[3]').click()
time.sleep(0.5)
#半年前写的不记得这块是要干嘛了,万一一开始能运行但中途卡住报错可能是需要修改此处的Xpath路径,在网页中按F12,CTRL+Shift+C点击某个按钮,在右侧的元素栏中找到对应的元素右键复制完整的Xpath路径,复制到以下value路径中。
through = driver.find_element(by=By.XPATH, value='//*[@id="1"]').click()
time.sleep(0.5)
# 判断人数
number = driver.find_element(by=By.XPATH, value='/html/body/div/table/tbody/tr[4]/td[5]')
if number.text == number_default:
print(f'第{i}次选课未成功')
driver.refresh()
else:
driver.find_element(by=By.XPATH, value='/html/body/div/table/tbody/tr[4]/td[6]/input').click()
time.sleep(0.5)
# 点击确定按钮
alertObject = driver.switch_to.alert
print(alertObject.text)
alertObject.accept()
print(f'第{i}次选课成功!!!!!!')
break
driver.switch_to.default_content()
time.sleep(0.5)
随后在桌面上找到刚刚写的my_Edge.cmd,双击打开
像使用普通浏览器一样搜索网上选课的网址
登陆
打开选课界面
先走一遍流程看看自己想选的课能否被唯一搜索到,并记录下目前选课的人数,例如“28/28”,表示已满员
完成以上步骤后将其余选项卡关闭,只保留需要选课界面,并回退到选课大厅界面
将目前人数填入第二个python文件第9行的number_default,
修改第38行的课程名
然后运行第二个Python文件
正常的运行结果是网页在不断的进入选课-搜索某课程-判断选课人数是否是默认的满员人数-窗口输出第*次选课未成功
然后静待选课成功的那一刻……
结尾:
再次强调只在改选阶段开启时才有效,毕竟我们学校公选课正选阶段不是靠抢的,代码是我上次改选阶段使用的,届时如果网页有更新或者运行有bug我会再来修改本文,先提前给各位道个歉。
大佬应该看出来代码主体都是用Xpath定位元素,确实很low,可以自行优化修改。本人菜鸡一个,教程没讲清楚的地方很多,还请见谅。
想深入了解的请关注:selenium用法详解【从入门到实战】【Python爬虫】【4万字】_selenium学习_Dream丶Killer的博客-CSDN博客