本文为大家分享了python实现图书馆研习室自动预约的具体代码,供大家参考,具体内容如下
<强>简介强>
现在好多学校为学生提供了非常良好的学习环境,通常体现在自习教室的设施设备上。对此不得不提一句的就是我们学校的图书馆,随着新图书馆的修,建馆内也设置了多个功能区,每层分为A, B, C, D四个区域,由南北连廊相连,中间由旋转楼梯贯通一至五层。区为自修区;B区和C区为藏阅一体的社会科学和自然科学书库;D区为专项功能区,包含影视厅,数字媒体创客体验中心,智慧培训教室,云桌面电子阅览室等;B, C区东西连廊设有大小十二间研习室;南北连廊设有休闲阅读区。
上面那段我是从图书馆官网上抄的,不过真的得为学校的图书馆点个赞。回归本篇文章正题,学校免费为广大师生提供了舒适优良设备齐全的研习室。但是这些研习室是需要进行网上预约才能够进入使用,每天的00:00开启下一天的预约,因此要想约到一个时间段(3小时)的研习室,可谓得“挑灯夜战”。当然,在这个过程中手速快将有巨大的优势。如果晚上休息的早,手速又不快,基本上就别想预约到研习室了。刚刚好最近学了一点python爬虫,就打算用爬虫帮我完成这个艰巨的任务了。哈哈哈哈! (ps:防止恶意访问,所有链接就不放了哈)
<强> python实现思路强>
想想思路还是挺简单的,无非就是登录账号,查找房间,提交预约。那就让我们试试看:
登录账号
首先打开我们研习室预约的登录界面,链接为:U2FsdGVkX19NdfJkghN54Msvy1zl7AucRur/ct0nz4orPI7uLkSDsvuFMgr0fGcO
rn9Z/f8h4bds9w==
好吧,这第一步登录账号就非常考验我这个新手了,不过不能怂。通过参考其他一些大佬使用的方法,就是打开firefox的firebug (ctrl + shift + e)查看网络情况,在这个情况下进行一次正常的登录。
可以看到我们这里有个帖子,到时便可以使用python中requests.post方法。
为了能够成功的登录,要隐藏自己是个爬虫的身份,在消息头中,可以看到我们的请求头,只要将参数都复制过来,组成自己的header={…}来欺骗服务器。
看一下参数这一页,这里的表单数据只有三个,分别对应着验证码,账号和密码。将这里的参数复制过来,就可以组成我们的data=https://www.yisu.com/zixun/{…}。其中需要我们的注意的就是这个验证码,无论是人工“自”能识别,还是机器自动识别,都需要将验证码保存为本地文件。如此一来,就有了一个问题,每访问一次服务器,验证码就会变换。现在让我们好好捋捋思路,首先我们得获得验证码并将其保存在本地,这就需要访问一次服务器,最后我们要提交我们的参数进行登录,这又再一次访问了服务器,这次的验证码和我们获取的验证码已经不是同一个验证码了。在刚刚开始的尝试中我无论如何无法登录服务器,就是两次的验证码不匹配。如何实现第一次获取的验证码和提交时的验证码相一致呢?
这里就需要同一个cookie在上面的几个图中,我们都能看到有个cookie值。要保证同步,这里就需要做的到,我们获取验证码时的cookie值和提交账号密码时的cookie值一致。因此,在我的程序中,我先做的一个步骤时先获取一个cookie值,然后将这个cookie值作为header中的一个参数。登录的思路就是这样了,补充一句,这里的验证码我是自己手动识别的>﹏
。<强>查找房间强>
这个步骤其实是一个无用的步骤,为什么有这个步骤,按照人为预约习惯,我们会产生怎么一个步骤,但是如果使用爬的虫,只要成功登录之后就可以直接提交预约的表单。当然,如果要使得自动预约程序更加智能,便可以添加这个步骤,可以查看那些房间是还可以预约的,在这里自定义的补充一些规则。我就略过了…
提交预约
同登录一样,我们也手动的提交一次,去查看网络情况,便可以用python模拟这一个过程。在这里我就不在贴图进行解释,这里提交也是用requests.post的方法,不过一点要注意的是,这里的头和登录时的标题是不一样的,所以在此提醒各位,如果在其他类似的预约程序中可以注意看看不同内容职务时的标题是否一致。我在这里就被坑了一会。