文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么在Python中使用webdriver实现一个图书馆座位自动预约功能

2023-06-06 18:46

关注

怎么在Python中使用webdriver实现一个图书馆座位自动预约功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Python主要用来做什么

Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。

Python chrome driver操作

怎么在Python中使用webdriver实现一个图书馆座位自动预约功能

有几个注意的点:

这就要求我们的程序得有足够的鲁棒性(哈哈蛤) 容错能力,不会一下崩了就没用了。
所以我选择用try...except...的方法去进行,写了好多个try, 希望能找到不写这么多Try的更好的方法。

导入库并声明浏览器:

from selenium import webdriveroption = webdriver.ChromeOptions()url='网址'local_dir = 'C:\\Users\\Administrator\\Desktop\\librarytest\\' #webdiriver 位置browser = webdriver.Chrome(local_dir+"chromedriver.exe",options=option)

完整流程:

使用selenium操作非常简单,就是find_element_by_id()find_element_by_xpath(),主要是看F12去找他们的xpath或者id。

def wholeProcess(browser): browser.get(url) try: btn=browser.find_element_by_xpath("/html/body/div[4]/div[2]/div[2]/dl/input") #找到登录的按钮,如果没找到证明还没到开放时间/系统在崩溃 except: return 1 #1说明预约还没到时候 '''执行到这里说明打开啦''' try: btn.click() username=browser.find_element_by_id("un") password=browser.find_element_by_id("pd")#找到账号密码 username.send_keys(studentNumber) password.send_keys(loginPassword) btn=browser.find_element_by_xpath('//*[@id="index_login_btn"]/input')#找到登录按键 btn.click() js=generateJsCode(startTime,endTime)#使用js代码来预约 res=browser.execute_script(js) return 0 except: return 2 #2说明打开了网页,但是遇到了其它问题

用js来预约

找到座位并选择,如果用鼠标操作的话是很繁琐的,包括先找到座位图标点击下拉选择开始时间和结束时间,再点击预约,这个过程麻烦不说,主要是容易出错。
而其实一个座位预定的本质其实是提交一个表单。浏览器的前端做了那么多人性化的操作,如可视化座位表、下拉框、温馨提示等,就是为了人使用时好看而又方便,而我们作为计算机就可以饶过他,直接提交表单。这里用的是selenium的execute_script()函数,可以用来执行网页上的js代码。

生成js代码

用F12去观察发现,图书管的表单提交需要下面几步:

$("#date").val("2020-12-10"); $("#reserveForm#seat").val("13022"); //座位号$("#start").val("540"); //用分钟表示的时间 : 540=9*60 即九点$("#end").val("1260");$("#reserveForm").submit();

因此这个函数用来生成js代码:

def generateJsCode(startTime_ori,endTime_ori): seatnumber_str = seatId startTime_str = str(startTime_ori * 60) endTime_str = str(endTime_ori * 60) tomorrowTime = (datetime.datetime.now() + datetime.timedelta(days=1)).strftime('%Y-%m-%d') # 明天 js = '$("#date").val("' + tomorrowTime + '");$("#reserveForm #seat").val("' + seatnumber_str + '");$("#start").val("' + startTime_str + '");$("#end").val("' + endTime_str + '");$("#reserveForm").submit();' return js

主函数——程序出错时尝试:

返回的状态中,如果网页没打开,让他休息10s再尝试,如果是其它原因,那么休息0.5秒就继续尝试:

if __name__=='__main__': browser = webdriver.Chrome(local_dir+"chromedriver.exe",options=option)#声明浏览器 while True: state=wholeProcess(browser) if state==0: #没出错  break: elif state==1:   logger.info("打开网页失败")  time.sleep(10) elif state==2:   logger.info("其它错误")  time.sleep(0.5)

检测是否成功:

除了上面提到的网页崩溃导致WebDriver报错,还有几种可能导致失败:

这几种错误都不会报错,会在执行代码后以标签的形式告诉我们,可以用关键字定位这些标签,如果失败可以选择预约PlanB:
比如:

try: a=browser.find_element_by_xpath("//*[contains(text(),'尽快')]") #有人约了(非全部时间) error_reason=a.text isNoSeat=True

logging: 生成每天的日志文件

写好小程序以后,几个兄弟听说了也想尝试,每天预约。
不想每天早上七点起来看,为了防止为止错误发生后还不知道是哪步出错,采取的办法是写日志文件(事后追责),这里使用的是logging这个包。
logger的初始化代码来源 : python的logging模块

import logging# 创建一个loggerlogger = logging.getLogger('mylogger')logger.setLevel(logging.DEBUG)# 创建一个handler,用于写入日志文件fh = logging.FileHandler(local_dir+'logfile\\'+logname+'.log')fh.setLevel(logging.DEBUG)# 再创建一个handler,用于输出到控制台ch = logging.StreamHandler()ch.setLevel(logging.DEBUG)# 定义handler的输出格式formatter = logging.Formatter('[%(asctime)s][%(thread)d][%(filename)s][line: %(lineno)d][%(levelname)s] ## %(message)s')fh.setFormatter(formatter)ch.setFormatter(formatter)# 给logger添加handlerlogger.addHandler(fh)logger.addHandler(ch)# 记录一条日志

记录时只要使用 logger.info("xxxxx")就可以,非常方便,写在了上面。

Windows定时任务

怎么在Python中使用webdriver实现一个图书馆座位自动预约功能

怎么在Python中使用webdriver实现一个图书馆座位自动预约功能

这样就程序就会每天早上执行,只要有一台不关机的电脑。

看完上述内容,你们掌握怎么在Python中使用webdriver实现一个图书馆座位自动预约功能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯