脚本功能

系统开放座位时快速预约指定位置

可以设置预约的时间段

运行以后会一直帮你抢,需要手动停止

即使遇到更强的脚本自动帮抢下一个座位

实现

首先解决登录问题,通过F12找出登录请求包,分析对比一下包可以发现一般只有用户名和密码这个参数是变化的,然后用requests.session()的实例化去请求登录接口,登录成功。

然后预约座位抓一下包,分析包找到变化的关键的参数,一般情况下关键参数只有座位id、开始时间、结束时间,其他的参数一股脑照搬就行了,接下来用刚刚登录成功的那个requests.session()实例去请求即可。

优化

既然是每天都帮抢那么一直去请求可不行,一是给服务器造成负担,二是如果有什么反爬策略容易被发现被封。所以每天到12点(系统预约开放时间)的时候发预约包就行。

万一脚本撞车了没抢到自己设定的座位怎么办,返回预约的结果,发现已经有人了自动预约下一个座位,也可以将自己心仪的座位写在列表里,这个抢不到抢下一个。

代码

(为了不给学校系统添加负担,代码仅供参考,无法直接运行)

import requests

from datetime import date

from datetime import timedelta

import json

import getopt

import sys

import time

global headers

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',

'Host': '',

}

#登录函数

def login(id, pwd):

l_params = {

'id': id,

'pwd': pwd,

'act': 'login',

}

#自己分析得到的接口,下同

login_url = ''

s = requests.session()

re = s.post(url=login_url, headers=headers, params=l_params)

#返回登录成功的实例

return s

#预约函数

def yd(s, start, end, s_id):

y_params = {

"dialogid": "",

#预定座位

"dev_id": s_id,

"room_id":"",

"type":"dev",

"prop":"",

"number":"",

"classkind":"",

"test_name":"",

"start": start,

"end": end,

"start_time": "800",

"end_time": "2200",

}

y_url = ''

re = s.get(url=y_url, headers=headers, params=y_params)

print(re.text)

res = json.loads(re.text)

msg = res['msg']

if msg == '操作成功!':

print('success')

return 1

elif msg == '2020-09-11只能提前[1]天预约':

return 0

else:

print('fail')

return 2

#脚本输入提示信息

def useage():

print(

'''

Usage:

-i 学号(必填)

-p 密码

-s 座位id

-b 开始时间,格式13:00,下同

-e 结束时间

''')

if __name__ == '__main__':

id = pwd = None

#不填默认抢这个这个时间段的这个座位

s_id = '100458282'

begin = '8:00'

end = '22:00'

#处理输入

try:

opts, args = getopt.getopt(sys.argv[1:], 'i:p:s:b:e:')

for name, value in opts:

if name == '-i':

id = value

if name == '-p':

pwd = value

if name == '-s':

s_id = value

if name == '-b':

begin = value

if name == '-e':

end = value

except getopt.GetoptError:

useage()

if not id:

useage()

sys.exit(3)

if not pwd:

pwd = id

#先获取后天时间

aftertomorrow = date.isoformat(date.today() + timedelta(days=2))

while True:

hour = int(time.strftime('%H',time.localtime(time.time())))

m = int(time.strftime('%M', time.localtime(time.time())))

#如果现在的明天等与之前的后天,即到了12点,开始抢座

if date.isoformat(date.today() + timedelta(days=1)) == aftertomorrow:

s = login(id, pwd)

start = aftertomorrow + ' ' + begin

endtime = aftertomorrow + ' ' + end

result = yd(s, start, endtime, s_id)

if result == 1:

#预约成功

aftertomorrow = date.isoformat(date.today() + timedelta(days=2))

sleep_time = (23 - hour) * 3600 + (59 - m) * 60 + 35

print('程序休眠{}s'.format(sleep_time))

print(aftertomorrow)

time.sleep(sleep_time)

elif result == 2:

#被预约,抢下一个id的座位

s_id = str(int(s_id) - 1)

continue

else:

continue

else:

sleep_time = (23 - hour) * 3600 + (59 - m) * 60

time.sleep(sleep_time)

结语

不知道你们的学校图书馆预约系统是什么样的,但是一般学校也不会花太多钱去搞这个,所以系统比较垃圾,大部分可以按照这个思路来。而且有些学校跟我们学校用的几乎相同的系统,肯定是出自同一个公司或者同一个模板的。如果你们学校也是类似的系统,代码改一下就能用。

我学校的系统主页大概长这样

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

  1. Python爬虫之XPath基础教程:用代码抓取网页数据

    Python爬虫之XPath基础教程:用代码抓取网页数据 在网络时代,网页数据是获取信息和进行分析的最重要的来源之一.Python的爬虫技术让我们可以轻松抓取网页数据,并进行数据处理.XPath是一种 ...

  2. python爬取大众点评评论_python爬虫抓取数据 小试Python——爬虫抓取大众点评上的数据 - 电脑常识 - 服务器之家...

    python爬虫抓取数据 小试Python--爬虫抓取大众点评上的数据 发布时间:2017-04-07

  3. 分享:Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据

    Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据 http://my.oschina.net/leopardsaga/blog/94774

  4. 「docker实战篇」python的docker-打造多任务端app应用数据抓取系统(下)(35)

    上次已经把python文件挂载到虚拟机上了,这次主要设置下虚拟机通过docker容器的方式. 运行 python 代码运行 >启动一个crt的会话 docker run -it -v /root ...

  5. python爬虫成长之路(一):抓取证券之星的股票数据

    python爬虫成长之路(一):抓取证券之星的股票数据 获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇 ...

  6. python爬虫实战(四):selenium爬虫抓取阿里巴巴采购批发商品

    一.前言 本编教程是通过selenium爬取阿里巴巴采购批发网址的商品数据信息,并保存到mongo.为什么用selenium呢,是因为网站大多数不再是静态网站,而是有诸如Ajax请求的动态网站,如果接 ...

  7. cutycapt php,PHP利用CutyCapt获取网页快照,抓取网页高清图片快照(教程)

    PHP利用CutyCapt获取网页快照,抓取网页高清图片快照(教程): // +------------------------------------------------------------ ...

  8. 如何利用CommMonitor串口监控,抓取串口Modbus RTU数据包

    今天来分享一下,如何抓取串口Modbus RTU数据包. 首先,下载CommMonitor的最新版v12.0,才支持Modbus RTU/ASCII协议分析功能, 同ModbusMonitor RTU ...

  9. python专科就业_利用Python分析复旦大学近五年转专业失败的情况

    昨天在实验室闲着无聊,看见我旦今年的转专业名单放了出来.突发奇想想用Python试着分析一下转专业的情况.说干就干. 首先得用到处理excel文件的库,常用的是xlwt, xlrd, openpyxl ...

最新文章

  1. 参加Python培训后能干嘛
  2. Go程序性能分析pprof
  3. 里bl2和bl3为什么分开_施工现场乙炔瓶为什么必须直立?乙炔为什么不能用尽?........
  4. OpenCV 像素的读取与操作
  5. python刘卫国实验题_MATLAB 程序设计与应用(刘卫国版)习题答案3-4
  6. python闹钟界面程序_「Python编程」自由管理时间之编写一个小闹钟起床
  7. 在线图表分析制作_(漂亮)象形柱状图表制作 在线图表制作工具
  8. 新微擎 v1.7.9 图文回复 标题emoji
  9. Linq-Order By操作
  10. java8 comparator接口_Java8 Comparator 排序方法
  11. 讯飞tts语音引擎_讯飞输入法A.I.语音引擎再升级 更强大更实用!
  12. 无线路由器的信道选择
  13. 友盟分享 qq没有存储权限 分享失败
  14. 每天学一点 mysql
  15. PYTHON单任务FTP断点续传程序
  16. thinkpade450装内存条_Thinkpad e450c我想加一个内存条,因为开机就满了百分50左右,该加什么样的内存条?低电...
  17. 在Elasticsearch使用URI花式搜索
  18. Android 仿大众点评团购购买条浮动效果
  19. cocos2d-x之怪物系统
  20. Linux 基于FTP协议文件传输系统

热门文章

  1. 查看路由器拨号的宽带密码
  2. 为什么计算机中的负数要用补码表示?
  3. SAP中重复制造生产计划编制——生产版本
  4. Python网络爬虫与信息提取(中国大学mooc)
  5. 第二节 python知识点梳理
  6. GAN-生成对抗网络(Pytorch)合集(2)--pixtopix-CycleGAN
  7. NBS云硬盘无法挂载
  8. 【舰船数据集格式转换】HRSID数据集VOC转COCO
  9. 安装ruby-2.3.1
  10. php如何实现自动加载mp3,PHP中自动加载的几种实现