因为旧系统停用,故分享此文章,给大家参考学习。
本文并非原创文章!下文转自网络一位老学长的文章,原作者为yananYangYSU/github,最初发布网址无从查找。本文仅仅是整理了MD格式使得文章更加readable。
本文也发布在我的网站,点击阅读原文可以访问。
写作动机近期作者疏于运动,加上吃得又多,打篮球天冷,所以想去室内打打羽毛球,锻炼一下身体,生命在于运动嘛,毕竟学计算机的人一天到晚地待在实验室对着电脑对身体不好。但是白天又没时间,所以就想着约个晚上的羽毛球场地,本来想着场地很好约,就没当回事,偶尔闲暇想起来的时候去预约网站上看一下,可没成想,接连好几天都显示无剩余场地可约...比较生气,遂写此文,以抒心中不平!
摘要天津大学场馆中心预定平台对于大家来讲应该都不陌生,该平台对外提供羽毛球、排球、篮球等场馆的在线预约服务,其目的是为了减少大家使用场地时的冲突,方便师生进行体育锻炼。然而,场地是有限的,面对大家日益增长的物质和文化需求,现有的场地资源已经显得力不从心,难以满足大家的需求,抢订场地的现象也逐渐蔚然成风。为了探究现有场馆的使用情况,本篇文章利用爬虫等技术进行了北洋园校区羽毛球馆场地预定数据的统计和分析,并分析了预定平台现有的工作流程和不足之处,并基于此研究设计和开源了一套自动预约软件,同时为预定平台中心建设提出了一些改进建议,希望减少脚本抢订等不公平现象的发生。
一、羽毛球馆场地预约现状1.1预约时间段和场地热度分析羽毛球场馆共计12个场地,其中1-8号场地位于场馆主场,9-12号场地位于东侧跑道附件的次场。当然了,大家都知道的嘛,主场的场地空间和相关照明设施要更好一点。每个场地都有使用时间段限制,通常以1小时为单位,从早晨8:00到晚上10:00,同时有些场地由于上课等其他事情的需要,开放时间段有固定限制。场地预定平台每天中午12:00开放后天的场地预定,比如周一中午12:00后可以预约周三的场地,因此类推。下图展示了某日中午12:30的可预约场地截图,红圈标明的地方是晚上7:00-9:00的场地,已经显示无场地可以用或者只剩下次场,而其他时间段的场地余量却比较充裕,我们可以猜测是晚间段的场地比较热门导致了时间不平衡性的出现。
为了验证猜测,我们采用爬虫对该网页的数据进行定期抓取,每天中午12:00统计昨日场地的剩余情况,将得到的信息绘制出来,如图1、2所示。图1展示了周一至周日羽毛球馆14个时间段场地的预约率,x轴代表每周天数,y轴代表每天的14个时间段,以小时为单位,z轴为标准化后的场地预定率(e.g.11/12=0.,8/8=1),预定率越高代表该时间段来打球的人越多。我们将三维图投影到xy平面上,如图3所示。可以很明显得看出:
1.白天和晚上的差距就更为明显,也表明大部分同学也更倾向于晚上去场馆打球。2.晚上19:00-21:00的时段最为热门,而同样是晚间的21:00-22:00相对来讲场地比较宽松一些,可能是由于场馆22:00闭馆的原因导致大家不愿意玩到太晚。3.上午场的人数很少,可能是由于上午大家基本都有功课要上,没有精力来体育馆打球。周六也出现了这种现象,而出现这种情况的原因大概是由于睡懒觉。
1.2热门场地竞争性分析基于上述的热点时段研究,我们可以得出晚上19:00-21:00时间段比较热门的结论,这也与我们的常识一致,但是这个时间段究竟有多热门呢?亦或者说这些时间段内的场地多久会被大家抢光?
针对这个问题,我们又抓取了每日12:00开放预约后的网页数据,每隔30秒钟采样,用下一个时间点采到的数据减去上一个时间点的数据就可以得出在这30秒的间隔内有多少场地被预约走,根据此方法,我们绘制了19:00-20:00的8个主场地的预约变化曲线,如图3、4所示,x轴代表时间,y轴代表8个主场地剩余量,蓝色数据点为多次采样的平均值,红色虚线为拟合曲线,我们可以发现:
1.场地剩余曲线呈现先快后慢的变化,开放预定的前5分钟,已经有一半的场地被预定走,说明抢订的人还是蛮多的。2.开放预定的前10秒内,已经有场地被预约走,有很大的可能性存在脚本预约的情况,这个结论图上反映得不太直观,因为采样存在时间延迟,而且事实上预约开放并不是准时的12点0分0秒,这里会在后面叙述。3.8个主场基本在30分钟内被订光,意思就是如果你不盯着时间点去抢订,能抢到漏网之鱼的几率很小。
文章写到这里,我们可以看到羽毛球黄金时段的主场地资源匮乏确实很严重,加上有些脚本抢场的存在,想提前预定上期待的场地可谓难上加难,而且大家也都没有那么多的时间去盯着天天盯着场地。但是,着急上火也没有用,毕竟你也管不了有些人(或者机器),不过也不是没有办法,对付这些抢场地的最有效手段就是跟他们对着抢,就看谁的程序好、网速快了。第二章我将详细讲述如何去分析场地预定工作流程并编写程序帮我们去实现小目标。
二、预备知识2.1啥是爬虫???互联网提供的服务大多数是以网站的形式提供的,而我们需要的数据一般都是从网页中获取的,如电商网站商品信息、商品的评论、微博的信息等。网站的网页是由HTML代码组成的,我们平时通过浏览器访问网页,发出请求后浏览器接收到对应的网页源代码,然后将其解析为页面内容再呈现给我们。
通俗来讲,爬虫的基本原理很简单,就是利用程序去代替人去访问网站,并将目标数据保存下来。爬虫当中涉及到的知识点大概如下,学计算机的人应该不会陌生,这个到后面会一一用到,我们继续往下走。
web后端知识,GET/POST,session等前端HTML、javascript等JavaHttpclient使用Jsoup页面解析包正则表达式Timer定时器Javamail包使用注意:未打钩代表可选用
2.2如何用程序去模拟浏览器访问网站?通常我们访问网站需要一个浏览器(e.g.IE,搜狗,谷歌),但是程序要想去访问网站,当然需要模拟出来一个浏览器(呃...其实浏览器本身也是程序写的),设计思路就是通过计算机程序来模拟出一个用户和浏览器,去替代人工进行场地预定。
话还没说完,出自于Java的Httpclient包就迫不及待地跳了出来,Httpclient包就是一个专门用于模拟浏览器的java工具包,使用起来也很简单,这里我们用一下小例子来演示下它的使用过程。首先,假设我们需要爬取体育馆预约平台首页的源代码,则需要引入Java的HttpClient包,新建一个