gpt4 book ai didi

使用Python webdriver图书馆抢座自动预约的正确方法

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章使用Python webdriver图书馆抢座自动预约的正确方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

文章目录 微信登录问题Python chrome driver操作导入库并声明浏览器:完整流程:用js来预约生成js代码 主函数――程序出错时尝试:检测是否成功:logging: 生成每天的日志文件 Windows定时任务后记: 学校的图书馆需要网上预约。复习考研的人多、疫情座位少,约上一个好点的座位对于我这种经常忘记事情的懒人来说很难.

考虑到老师实验室有一台供我们使用的Windows服务器是不会关机的,正好可以帮我在早上7:00预约系统开启的时候执行程序去预约一个座位。所以产生了这个想法.

微信登录问题

想用chromedriver去操作,方便快捷,但我们图书馆的预约在微信上进行的,在微信公众号上认证过帐号以后,会发送一个链接,点进去就是自己的登录信息。经过和同学的验证,他将他的链接发送给我,我就可以打开他的登录信息。这让我感到很神奇,本以为登录信息仅仅携带在网址上,但如果在微信中用浏览器打开,再将网址复制到其它浏览器,会登陆失败。查找一系列百度谷歌想弄清楚这个问题,应该与cookies之类的有关,这里希望以后可以填坑.

当我没有找到头绪的时候,我偶然间发现学校图书馆开放了另一个入口可以在网页上预约,而这个流程就清晰很多了:

  • 进入网站
  • 输入账号和密码,点击登录按钮
  • 找到座位并选择

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报错,还有几种可能导致失败

  • 座位被人抢了

最后此篇关于使用Python webdriver图书馆抢座自动预约的正确方法的文章就讲到这里了,如果你想了解更多关于使用Python webdriver图书馆抢座自动预约的正确方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com