问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

求助:实现图书馆借书系统

发布网友 发布时间:2022-04-28 14:28

我来回答

11个回答

懂视网 时间:2022-04-18 09:55

这篇文章主要为大家详细介绍了python实现图书馆研习室自动预约功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文为大家分享了python实现图书馆研习室自动预约的具体代码,供大家参考,具体内容如下

简介

现在好多学校为学生提供了非常良好的学习环境,通常体现在自习教室的设施设备上。对此不得不提一句的就是我们学校的图书馆,随着新图书馆的修建,馆内也设置了多个功能区,每层分为A、B、C、D四个区域,由南北连廊相连,中间由旋转楼梯贯通一至五层。A区为自修区;B区和C区为藏阅一体的社会科学和自然科学书库;D区为专项功能区,包含影视厅、数字媒体创客体验中心、智慧培训教室、云桌面电子阅览室等;B、C区东西连廊设有大小十二间研习室;南北连廊设有休闲阅读区。

上面那段我是从图书馆官网上抄的,不过真的得为学校的图书馆点个赞。回归本篇文章正题,学校免费为广大师生提供了舒适优良设备齐全的研习室。但是这些研习室是需要进行网上预约才能够进入使用,每天的00:00开启下一天的预约,因此要想约到一个时间段(3小时)的研习室,可谓得“挑灯夜战”。当然,在这个过程中手速快将有巨大的优势。如果晚上休息的早,手速又不快,基本上就别想预约到研习室了。刚刚好最近学了一点python爬虫,就打算用爬虫帮我完成这个艰巨的任务了。哈哈哈哈!(ps:防止恶意访问,所有链接就不放了哈)

python实现思路

想想思路还是挺简单的,无非就是登录账号、查找房间、提交预约。那就让我们试试看:

登录账号

首先打开我们研习室预约的登录界面,链接为:U2FsdGVkX19NdfJkghN54Msvy1zl7AucRur/ct0nz4orPI7uLkSDsvuFMgr0fGcO
rn9Z/f8h3bds9w==

好吧,这第一步登录账号就非常考验我这个新手了,不过不能怂。通过参考其他一些大佬使用的方法,就是打开firefox的firebug(ctrl+shift+e)查看网络情况,在这个情况下进行一次正常的登录。

可以看到我们这里有个post,到时便可以使用python中requests.post方法。

为了能够成功的登录,要隐藏自己是个爬虫的身份,在消息头中,可以看到我们的请求头,只要将参数都复制过来,组成自己的headers = {…}来欺骗服务器。

看一下参数这一页,这里的表单数据只有三个,分别对应着验证码、账号和密码。将这里的参数复制过来,就可以组成我们的data = {…}。其中需要我们的注意的就是这个验证码,无论是人工“自”能识别,还是机器自动识别,都需要将验证码保存为本地文件。如此一来,就有了一个问题,每访问一次服务器,验证码就会变换。现在让我们好好捋捋思路,首先我们得获得验证码并将其保存在本地,这就需要访问一次服务器,最后我们要提交我们的参数进行登录,这又再一次访问了服务器,这次的验证码和我们获取的验证码已经不是同一个验证码了。在刚刚开始的尝试中我无论如何无法登录服务器,就是两次的验证码不匹配。如何实现第一次获取的验证码和提交时的验证码相一致呢?

这里就需要同一个cookie在上面的几个图中,我们都能看到有个cookie值。要保证同步,这里就需要做到,我们获取验证码时的cookie值和提交账号密码时的cookie值一致。因此,在我的程序中,我先做的一个步骤时先获取一个cookie值,然后将这个cookie值作为headers中的一个参数。登录的思路就是这样了,补充一句,这里的验证码我是自己手动识别的>﹏<。

查找房间

这个步骤其实是一个无用的步骤,为什么有这个步骤,按照人为预约习惯,我们会产生怎么一个步骤,但是如果使用爬虫,只要成功登录之后就可以直接提交预约的表单。当然,如果要使得自动预约程序更加智能,便可以添加这个步骤,可以查看那些房间是还可以预约的,在这里自定义的补充一些规则。我就略过了。。。

提交预约

同登录一样,我们也手动的提交一次,去查看网络情况,便可以用python模拟这一个过程。在这里我就不在贴图进行解释,这里提交也是用requests.post的方法。不过一点要注意的是,这里的headers和登录时的headers是不一样的,所以在此提醒各位,如果在其他类似的预约程序中可以注意看看不同内容post时的headers是否一致。我在这里就被坑了一会。


#!/usr/bin/env python 
# _*_ coding:utf-8 _*_ 
# 
# @Version : 1.0 
# @Time : 2018/4/10 
# @Author : 圈圈烃
# @File : reservation_4.py 

import requests
import re
import json
import datetime
import time


def get_cookies():
 """获得cookies"""
 url = 'http://**************'
 s = requests.session()
 s.get(url)
 ck_dict = requests.utils.dict_from_cookiejar(s.cookies) # 将jar格式转化为dict
 ck = 'JSESSIONID=' + ck_dict['JSESSIONID']  # 重组cookies

 """获得二维码"""
 path = './code.png'
 get_cookies_headers = {
 'user-anget': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0',
 'Cookie': ck}
 get_cookies_url = 'http://**************'
 code_image = requests.get(get_cookies_url, headers=get_cookies_headers)
 with open(path, 'wb') as fn:
 fn.write(code_image.content)
 fn.close()
 print('验证码保存成功')
 return ck


def login(cookies, hour, minute):
 login_headers = {
 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
 'Accept-Encoding': 'gzip, deflate',
 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
 'Cache-Control': 'no-cache',
 'Connection': 'keep-alive',
 'Content-Length': '45',
 'Content-Type': 'application/x-www-form-urlencoded',
 'Cookie': cookies,
 'Host': '**************',
 'Pragma': 'no-cache',
 'Referer': 'http://**************',
 'Upgrade-Insecure-Requests': '1',
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'
 }
 login_url = 'http://**************'
 login_data = {
 'codeImage': input('请输入验证码:'),
 'uname': '**************',
 'upass': '**************'
 }
 requests.post(login_url, data=login_data, headers=login_headers)

 res = requests.get('http://**************', headers=login_headers)
 reg_h = r'<option value=(.*?)>d{4}-d{2}-d{2}' # 匹配可提供预约的hash
 value_h = re.findall(reg_h, res.text)

 """定时"""
 counter = 0
 while (True):
 now = datetime.datetime.now() # 获取当前系统时间
 if now.hour == hour and now.minute == minute:
 break
 time.sleep(0.5)
 # print(now)
 counter = counter + 1
 if counter == 240:
 res = requests.get('http://**************', headers=login_headers)
 reg_h = r'<option value=(.*?)>d{4}-d{2}-d{2}' # 匹配可提供预约的hash
 reg_t = r'(d{4}-d{2}-d{2})' # 匹配可提供预约的日期
 value_h = re.findall(reg_h, res.text)
 value_t = re.findall(reg_t, res.text)
 with open('./con_log.txt', 'a') as fjs:
 fjs.write(eval(value_h[-1])+' '+value_t[-1]+' '+str(now)+' 
')
 fjs.close()
 print('保存成功')
 counter = 0

 return str(eval(value_h[-1]))


def reservation(day_hash, cookies, stime, etime):
 reservation_data = {
 '_etime': etime, # 结束时间11点,其值为11*60=660
 '_roomid': '1285b3ca77594b3095c7b89d4922553c', # 房间Id
 '_seatno': '',
 '_stime': stime, # 开始时间8点,其值为8*60=480
 '_subject': '学习', # 研讨主题
 '_summary': '学习', # 研讨大纲
 'ruleId': day_hash,
 'usercount': 3, # 预约人数
 'users': '**************', # 学号
 'UUID': '**************'
 }

 reservation_headers = {
 'Accept': 'application/json, text/javascript, */*; q=0.01',
 'Accept-Encoding': 'gzip, deflate',
 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
 'Cache-Control': 'no-cache',
 'Connection': 'keep-alive',
 'Content-Length': '239',
 'Content-Type': 'application/json',
 'Cookie': cookies,
 'Host': '**************',
 'Pragma': 'no-cache',
 'Referer': 'http://**************',
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'
 }
 reservation_js = json.dumps(reservation_data)
 reservation_url = 'http://**************'
 status = requests.post(reservation_url, data=reservation_js, headers=reservation_headers)
 # print(stime, etime)
 # print(status)
 print(status.text)


def main():
 """预约策略一:11:20-20.40"""
 full_stime = ['1060', '870', '680']
 full_etime = ['1240', '1050', '860']
 """预约策略二:10:00-13:00;13:50-16:50;17:40-20:40"""
 stime = ['1060', '830', '600']
 etime = ['1240', '1010', '780']
 cookies = get_cookies()
 day_hash = login(cookies, 0, 0) # 设定定时时间
 for i in range(0, 3):
 reservation(day_hash, cookies, stime[i], etime[i])


if __name__ == '__main__':
 main()

实现效果

自从学了python,妈妈再也不用担心我抢不到研习室了。在程序中加几行定时的程序之后,便可以在00:00自动帮我预约研习室了。通过测试发现,预约时很大程度上是能够约到房间的,例如在4-12号,约好三个时间段是用了7秒,但是在4-13号居然花了21秒,而且使得一个时间段被其他同学约走了。当然这个程序还需要进一步改进,实现完胜“手速”。

补在最后

还有不足,欢迎交流。

热心网友 时间:2022-04-18 07:03

#include <iostream>
#include <string>
using namespace std;

class Book //设置图书馆藏书类,用以封存图书信息
{
public:
Book (string n, int N, string p) //图书类构造函数
{
name = n; //设置图书书名
NO = N; //设置图书库存量
publisher = p; //设置图书出版社
}

void display() //display函数,以显示图书信息
{
cout << "书名:" << name << endl;
cout << "目前库存:" << NO << endl;
cout << "图书出版社:" << publisher << endl;
cout << endl;
}

//为方便调用,以下数据全部定义为公用
string name; //图书书名
int NO; //图书库存量
string publisher; //图书出版社
};

//创建图书馆藏书小数据库,图书序号等于该对象数组的下标
Book book[6] =
{
Book ("C++ primer", 3, "人民邮电出版社") ,
Book ("Python核心编程", 3, "人民邮电出版社") ,
Book ("Writing clean code", 3, "电子工业出版社") ,
Book ("简体中文Solaris 10用户指南", 3, "Sun Microsystems, Inc") ,
Book ("《The C Programming Language》第二版", 3, "机械工业出版社") ,
Book ("计算机程序设计艺术第三版第一卷:基本算法", 3, "国防工业出版社")
};

void display_all() //显示图书馆所有图书,方便读者借阅
{
int i;

cout << "这是图书馆的所有图书" << endl;
for (i = 0; i<6; i++)
{
cout << "图书序号:" << i << endl;
cout << "书名:" << book[i].name << endl;
cout << "目前库存:" << book[i].NO << endl;
cout << "图书出版社:" << book[i].publisher << endl;
cout << endl;
}
}

class people
{
public:
people(string nam, int num) //student构造函数
{
name = nam;
number = num;
}
void borrow(int); //定义借书成员函数
void back(int); //定义还书成员函数
private:
string name; //性名
int number; //在图书馆已借图书数量
};
// student类,用以定义学生信息
class student : public people
{
public:
student(string nam, int num, int gra) : people (nam, num) //student构造函数
{
grade = gra;
}

private:
int grade; //学生年级
};

//teacher类,teacher是student的派生类
class teacher : public people
{
public:
teacher(string nam, int num, string t) : people(nam , num) //派生类构造函数
{
title = t; //教师职称
}

private:
string title; //教师职称
};

void people :: borrow (int a) //借书成员函数
{
int i, j; //定义两个整型变量,以便需要shirt使用
char k; //定义字符型变量以便进行Y/N的判断

void service() ; //声明service函数

if (number >= a) //首先进行权限判断,如果读者已借书数量不小于他的权限,则提示进行其他操作
{
cout << "根据您的权限,你最多能借" << a << "本书!您现在不能借书欢迎下次再来" << endl;
cout << "您是否想进行其他操作? (是请输入y, 退出请输入n) " << endl;
cin >> k;
if (k == 121)
service ();
if (k == 121)
return;
else if (k = 110)
return;
cout << endl;
}
else
{
display_all() ; //调用display_all函数,输出所有图书显示,方便读者借阅

cout << "您想借哪本书? 请输入图书序号0-5" << endl;
cin >> i;
while (book[i].NO == 0 || i>5 || i<0) //判断所要借图书的库存及输入的合法性
{
cout << "您输入的图书序号错误或者所借书库存不足,请重新输入.图书序号是0-5" << endl;
cin >> i;

//提示读者是否进行其他操作
cout << "您是否想进行其他操作? (是请输入y, 继续借书请输入n) " << endl;
cin >> k;
if (k == 121)
service (); //如果读者要进行其他操作,则引用service函数,对读者进行重新引导
if (k == 121)
return; //进行其他操作完毕,直接跳出borrow函数
else
continue; //若读者选择继续借书,则跳出本次循环,进行下一次循环

}
cout << endl; //此处还行是为了人机界面的美观
cout << "以下是您要借的书籍的信息" << endl;

book[i].display();

cout << "您想借几本书?" << endl;
cin>>j;

//判断读者的权限、图书馆库存及输入的合法性
while ((a-number)<j || book[i].NO<j || j<0 || j>3)
{
cout << "因为你的权限不够、数量输入有误或者图书馆库存不足,";
cout << "你目前不能借这么多书!请输入一个合适的数目." << endl;
cin>>j;

//提示读者是否进行其他操作
cout << "您是否想进行其他操作? (是请输入y, 继续借书请输入n) " << endl;
cin>>k;
if (k == 121)
service();
if (k == 121)
return;
else
continue;
cout << endl;

}

book[i].NO = book[i].NO - j; //借书完毕,对图书馆的小数据库从新调整一下
number = number + j; //借书完毕,读者已借书籍数量要加上现在借的书数量
cout << endl;
cout << "您在图书馆还可以借 " << a - number << " 本书" << endl;
cout << "《" << book[i].name << "》" << "目前剩余" << book[i].NO << "本" << endl;
}
} //borrow函数结束

void people::back (int a) //还书成员函数
{
int n, m;
char k;

void service() ;

cout << "您要还哪本书" << endl;
cin >> n;
while (book[n].NO = 3) //判断图书馆库存,库存是满的,那就没人从这借过这种书而且没还
{
cout << "您借过这本书吗?请重新输入图书序号. " << endl;
cin>>n;
cout << "您是否想进行其他操作? (是请输入y, 继续还书请输入n) " << endl;
cin>>k;
if (k == 121)
service();
if (k == 121)
return;
else
continue;
cout << endl;
}
while (n>5 || n<0) //判断读者所要借的书是否存在
{
cout << "您输入的图书序号错误,请重新输入.图书序号是0-5. " << endl;
cin>>n;
cout << "您是否想进行其他操作? (是请输入y, 继续还书请输入n) " << endl;
cin >> k;
if (k == 121)
service () ;
if (k == 121)
return;
else
continue;
cout << endl;

}
cout << endl; //此处换行是为了人机界面的美观

cout << "以下是您要借的书籍的信息" << endl;
book[n].display () ;

cout << "你要还几本书" << endl;
cin >> m;

//判断图书馆这种书的库存是否小于读者要还的书的数量,及读者输入的合法性
while ((3-book[n].NO) <m || m>3)
{
cout << "您有借过这么多书吗?请重新输入." << endl;
cin >> m;
cout << "您是否想进行其他操作? (是请输入y, 继续借书请输入n) " << endl;
cin >> k;
if (k == 121)
service ();
if (k == 121)
return;
else if (k = 110)
continue;
cout << endl;

}
book[n].NO += m; //还书完毕,及时对图书馆的数据库进行整理
number -= m; //读者已借书籍数减轻现在所还书籍数量

//以下是一些给读者的提示信息
cout << "恭喜!您还书成功!" << endl;
cout << "你还可以借 " << a-number << " 本书!" << endl;
} //back函数结束

void service () //service函数,完成对读者的服务、询问功能
{
int a;
int b;

student stud("ming", 0, 2007); //定义student类的对象stu,并初始化
teacher tea("li", 0, "assistant"); //定义teacher类的对象tea,并初始化

//询问读者身份,给出选项
cout << "欢迎来到图书馆,请问您的身份是: (请输入首数字) " << endl;
cout << "1.教师" << endl;
cout << "2.学生" << endl;
cin >> a;

while (a != 1 && a != 2) //对读者的错误输入进行提醒
{
cout << "请输入正确的选项:" << endl;
cin >> a;
}
cout << endl;
cout << "请问您想要: (请输入首数字) " << endl; //询问读者所希望进行的工作,给出选项
cout << "1.借书" << endl;
cout << "2.还书" << endl;
cout << "3.离开借书台" << endl;
cin >> b;
while (b != 1 && b != 2 && b != 3) //对读者的错误输入进行提醒
{
cout << "请输入正确的选项" << endl;
cin >> b;
}
cout << endl;

if (a == 1) //如果读者是老师,则进行以下操作
{
if (b == 1)
{
tea.borrow(6); //调用借书函数
}
else if (b == 2)
{
tea.back(6); //调用还书函数
}
else
{
cout << " = ^_^ = 谢谢您的光临!\n" << endl; //退出
}
}
else if (a == 2) //如果读者是学生,则进行以下操作
{
if (b == 1)
{
stud.borrow(4);
}
else if (b == 2)
{
stud.back(4);
}
else
{
cout << " = ^_^ = 谢谢您的光临!\n" << endl;
return;
}

}
cout << endl;

} //service函数结束

//主函数
int main()
{
char k;

service() ;

while (1) //操作完毕,提示读者是否进行其他操作。
{
cout << "是否继续进行其他操作?";
cout << " (进行其他操作请输入y, 退出请输入n) " << endl;
cin >> k;
cout << endl;
if (k == 121)
service ();
else
cout << " = ^_^ = 谢谢您的光临!\n" << endl;
break;
}

return 0;
}

热心网友 时间:2022-04-18 08:21

留个脚印,回去看看

热心网友 时间:2022-04-18 09:56

吃完饭帮你写个。。有分当然要赚啦^^

热心网友 时间:2022-04-18 11:47

你这样不是很好,这个我们要是给你了,我们无所谓,你还是不会。这样值吗?

热心网友 时间:2022-04-18 13:55

给你的hi 留言了

热心网友 时间:2022-04-18 16:20

lz,你这是一个小系统了。。
如果你增分
我会考虑帮你做滴。。嘿嘿

热心网友 时间:2022-04-18 19:01

买一套汇文文献管理系统
图书馆专用的

http://www.libsys.com.cn/

热心网友 时间:2022-04-18 21:59

估计没人能帮你提供满意的回答的了

热心网友 时间:2022-04-19 01:14

你要用C++实现吗??
管理系统用别的语言比较快啊!

热心网友 时间:2022-04-19 04:45

你要的是什么呀?
方案还是程序实现呀!
如果方案我到是有(毕业设计我就是这个题目)如果是程序实现我就不会了
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
杭州自驾游必备物品清单_皖浙天路哪里可以露营 杭州临安星泉谷度假村的游玩指南是什么? 杭州周边露营野炊地点有哪些推荐 公司破产后,担保债务是否优先于员工薪资? 破产中行使别除权的人,需否申报债权? 《民法典》下的企业破产后担保债权如何清偿 突然感觉到头晕恶心身体出汗怎么回事 电箱吉他各种效果器连接顺序 彭水县属于重庆哪个市 彭水县属于哪个区管辖 python能做什么,从入门到就业,需要什么书籍,要不要数据库,要不要算法... 图书管理系统可以用什么语言写?求大神告知 有一门课程要求做一个图书管理系统,有前端和后台的,要连接数据库的,下... python 做一个图书管理系统,数据库:sqlite python,要编程 图书管理系统,如何建立图书信息和书籍信息的数据库? 图书管理系统(Python) 全球混血女影星有哪些 介绍点女明星曾经的辉煌成绩!比如玛丽亚凯莉、梅艳芳……等 混血女明星有哪些 大家觉得是赵薇名气大还是蔡依林 马来西亚柔佛州新山有哪些女星 淘宝余额关闭余额宝里面的钱可以提出来吗 淘宝付款提示余额宝关闭是什么意思 怎么查看淘宝余额支付是否关闭 帝皇蟹蒸熟后如何保存 帝王蟹冷冻还是冷藏 火山小视频的LOGO是什么? 怎么把电子签名ps到pdf图中 怎么样在pdf文件中ps文字 保险金额现金价值表怎么看?老是看不懂? 海尔滚筒洗衣机的四个脚怎么升高? 我电脑桌面上的搜狗输入法的皮肤为什么老是换不了呢? 刚买的海尔自动洗衣机,安装在厨房,下面不够高,要在下面垫东西。怎么调试平衡。 海尔洗衣机新买的都要垫的歪着,里面的内桶才会平衡吗? 为什么的我搜狗拼音输入法更换皮肤是老错误?急救 海尔洗衣机蹦高怎么回事 海尔滚筒洗衣机安置有什么减振方法? 为什么我下载了搜狗输入法的皮肤用不了啊那个文件图标是临时文件图标!!求解救。 海尔洗衣机离地面太近我想买个垫脚 为什么我的搜狗普输入法皮肤换不了 为什么搜狗输入法有的皮肤安装失败。 海尔洗衣机垫脚怎么调 安装搜狗拼音输入法的皮肤失败怎么解决 海尔洗衣机包装里配的4根海绵条是干什么用的? 为什么搜狗的输入法皮肤解压失败 无法安装 海尔波轮洗衣机(整流桥)安装在哪里? 海尔洗衣机抗冻吗?使用环境最低温度是多少度 海尔洗衣机低下的泡沫垫需要拆除吗? 海尔洗衣机还用防潮垫吗 有哪位高手知道,海尔滚筒洗衣机观望窗垫&#92;观望窗胶圈怎么拆?不甚感激!
  • 焦点

最新推荐

猜你喜欢

热门推荐