学校的图书馆需要网上预约。复习考研的人多、疫情座位少,约上一个好点的座位对于我这种经常忘记事情的懒人来说很难。

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

微信登录问题

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

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

进入网站

输入账号和密码,点击登录按钮

找到座位并选择

Python chrome driver操作

有几个注意的点:

每天早上系统开放的时间有几分钟的差别,需要留时间尝试。

刚开放的时候,系统会很卡,所以很可能会出现获取元素失败之类的情况。

这就要求我们的程序得有足够的鲁棒性(哈哈蛤) 容错能力,不会一下崩了就没用了。

所以我选择用try...except...的方法去进行,写了好多个try, 希望能找到不写这么多Try的更好的方法。

导入库并声明浏览器:

from selenium import webdriver

option = 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图书馆抢座自动预约的正确姿势相关推荐

  1. 【记录】用Python webdriver图书馆抢座自动预约的正确姿势

    文章目录 微信登录问题 Python chrome driver操作 导入库并声明浏览器: 完整流程: 用js来预约 生成js代码 主函数--程序出错时尝试: 检测是否成功: logging: 生成每 ...

  2. (图书馆抢座助手)利用jsoup实现学校图书馆自习室预约系统

    (图书馆抢座助手)利用jsoup实现学校图书馆自习室预约系统 写在前面 之前在图书馆约座,总是需要半夜十二点抢座,有时候还抢不到座位,带来了一些困扰,于是便萌生了写一个app可以自动约座.想到了之前学 ...

  3. 学校图书馆抢座 Python完成

    脚本实现 使用postman对图书馆抢座系统的一个或者多个接口进行分析. 找到接口返回参数和需要参数之间的联系,实现登录与抢座的大体思路. 第二步是全部工作的重点和难点,解决了第二步,代码基本功能就能 ...

  4. python图书馆抢座代码_“我去图书馆”公众号代码抢座的实现

    因为要考研嘛,想去图书馆.我们学校是早上六点开抢,同学们太猛,我每天5点50起床抢,都不太抢的到想要的座位,于是我就花了个两三天琢磨着怎么用代码来实现这个抢座,目前已经完成,虽然因为微信的那个sess ...

  5. 作为一名Python程序员,论听歌的正确姿势?

    程序员听歌的正确姿势. 这有啥,无非就是跪.趴.躺- 啊呸,说错了,正确姿势可能是? 打开网易云–>找到榜单–>选歌 But!!! 这也太普通太随意了嘛,来看一个Python程序员的打开方 ...

  6. python图书馆抢座_python模拟表单提交登录图书馆

    本文实例为大家分享了python模拟登录图书馆的具体代码,供大家参考,具体内容如下 模拟表单提交的原理: 我们都知道Http是无状态的,所以当我们提交的数据和浏览器中正常提交一样,那么服务器就会返回和 ...

  7. python图书馆预约系统_python实现图书馆研习室自动预约功能

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. python初学火车座位判断_初学Python实现学校图书馆座位自动抢座预约

    初学Python实现学校图书馆座位自动抢座预约 初学Python实现学校图书馆座位自动抢座预约 最近突然有个想利用python爬取学校图书馆预约的想法(因为图书馆单人的座位很难抢)可是没学过pytho ...

  9. python判断座位号_利用Python实现图书馆座位抓取(自动预约),python,抢座

    脚本功能 系统开放座位时快速预约指定位置 可以设置预约的时间段 运行以后会一直帮你抢,需要手动停止 即使遇到更强的脚本自动帮抢下一个座位 实现 首先解决登录问题,通过F12找出登录请求包,分析对比一下 ...

  10. Python爬虫 | 图书馆公众号座位自动预约【从0到1】

    引言 图书馆座位太难预约了! Case 1:抢座开始时间点,网堵,页面卡顿. Case 2:疫情期间,24小时书房每天仅有50个座位可预约. Case 3:可能有其他事情耽搁了,忘记抢座,稍晚点回来, ...

最新文章

  1. opencv图像旋转
  2. SQL Server 环形缓冲区(Ring Buffer) -- 介绍
  3. LNMP添加、删除虚拟主机及伪静态使用教程
  4. 【整理】视图簇View cluster的创建
  5. SpringBoot实现懒加载@Lazy
  6. jsonobject修改key的值_修改JSONArray里所有key的值
  7. C#实践设计模式原则SOLID
  8. 探讨NET Core数据进行3DES加密或解密弱密钥问题
  9. 野鸡NOI.AC模拟赛【2019.10.26】
  10. Ubuntu远程服务器创建新用户并赋予权限
  11. The Stanford Geostatistical Modeling Software(地质统计软件)
  12. IE8中动态改变伪元素样式不起作用BUG
  13. appium+python的APP自动化(1)
  14. 【多多情报通】拼多多个人店铺怎么升级为企业店铺?怎么转让?
  15. 模具设计进程中应注意哪些问题
  16. 自学单片机能找到工作吗?能有出路吗?
  17. mac 文字识别软件ocr_树洞OCR文字识别软件for mac-树洞OCR文字识别mac版v1.2.0 最新版-腾牛苹果网...
  18. 学习遇见狂神说的Java
  19. java svg png_java batik svg转png报错,球大神!!!在线等
  20. Linux下Docker安装微信文件传输问题

热门文章

  1. 计算机大神专业小说,大神作品排行榜:网络小说大神级作者前50名
  2. Java使用多线程,UPD通过控制台之间互相通讯
  3. 计算机混合运算java,大话Java混合运算规则
  4. 根据特征码搜索基址,VC写的源码
  5. 两步解决【zabbix】Time zone for PHP is not set (configuration parameter “date.timezone”)
  6. mysql-8.0.16-winx64的最新安装教程
  7. -Xms -Xmx -Xmn -Xss 核心总结
  8. matlab股票5日移动均线,一分钟,看懂五日均线图!
  9. 一根均线选股法_一条均线走天下,经典实用的均线选股战法,学会让你少走弯路!...
  10. 美国大厂码农薪资曝光:年薪18万美元,够养家,不够买海景房