因为我们学校在这学期改了课表系统,着实看不懂。。。。就想搞个校历和课表联合的加强版校历
设想下,可以不可以只要你店下校历上的今天的日期就会出现今天的课表,岂不是非常醒目
比如:
接下来我们来实现下
先来爬取下所有的课表
获取课表的链接:
http://jwglxt.hmlc.edu.cn/jwglxt/kbcx/xskbcx_cxXskbcxIndex.html?gnmkdm=N2151&layout=default&su=改为您的学号
通过抓包发现有课表数据的链接是:
http://jwglxt.hmlc.edu.cn/jwglxt/kbcx/xskbcx_cxXsgrkb.html?gnmkdm=N2151&su=改为您的学号
下面是课表爬取代码实现
# 爬取课表
def get_class_schedule():
try:
# 创建一个options的对象
opt = Options()
# 添加浏览器配置信息headless=无头
opt.add_argument('--headless')
# 配置disable-gpu可以让速度快一点
opt.add_argument('--disable-gpu')
url = 'http://jwglxt.hmlc.edu.cn/jwglxt/kbcx/xskbcx_cxXsgrkb.html?gnmkdm=N2151&su=改为您的学号'
web = Chrome(options=opt)
web.get("http://jwglxt.hmlc.edu.cn/jwglxt/xtgl/login_slogin.html")
web.find_element_by_xpath('//*[@id="yhm"]').send_keys(input("请输入您的账号:"))
web.find_element_by_xpath('//*[@id="mm"]').send_keys(input("请输入您的密码:"))
print('请稍等...')
sleep(0.5)
web.find_element_by_xpath('//*[@id="dl"]').click()
# 必须休息1秒
sleep(1)
# 获取cookies
cookie_dic = {dic['name']: dic['value'] for dic in web.get_cookies()}
header = {
'Accept-Language': 'zh-CN,zh;q=0.9',
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'Referer': 'http://jwglxt.hmlc.edu.cn/jwglxt/kbcx/xskbcx_cxXskbcxIndex.html?gnmkdm=N2151&layout=default&su=改为您的学号',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
data = {
'xnm': '2021',
'xqm': '3',
'kzlx': 'ck',
'_search': False,
'nd': '1633358955002',
'queryModel.showCount': '15',
'queryModel.currentPage': '1',
'queryModel.sortName': '',
'queryModel.sortOrder': 'asc',
'time': '0'
}
param = {
'doType': 'query',
'gnmkdm': 'N2151',
'su': '您的学号',
}
resp = requests.post(url, headers=header, data=data, params=param, cookies=cookie_dic)
for i in resp.json()['kbList']:
week = i['xqjmc'] # 星期
lesson = i['kcmc'] # 课名
classroom = i['cdmc'] # 教室
# 可能会有'1-12周(单),20周'
cycles = re.findall('\d+|\d{2}', i['zcd'])
if len(cycles) != 3:
cycle = [w for w in range(int(cycles[0]), int(cycles[-1]) + 1)] # 周次
elif len(cycles) == 3:
cycle = [w for w in range(int(cycles[0]), int(cycles[-2]) + 1)] # 周次
cycle.append(int(cycles[-1]))
else:
print('有点问题,可能课表不一样:' + i['zcd'])
section = i['jc'] # 上数
teacher = i['xm'] # 教师
class_grade = i['jxbzc'] # 班级
row_coordinate = week[-1] # 行坐标,cycle中的每个元素都是列坐标
# 需要显示的备注
message = '教室:' + classroom + '\n' + '课名:' + lesson + '\n' + '课节:' + section + '\n' + '老师:' + teacher + '\n' + '班级:' + class_grade
# 行坐标,列坐标,备注信息
yield (row_coordinate, cycle, message)
except Exception:
print(Exception, '可能密码错啦...')
我们拥有了课表信息了,下面实现和校历对接。
校历是我直接复制的,不是通过代码实现的,所以如果需要使用本人的代码,需要下载此文件
因为我没有做绝对路径的处理,需要把代码和文件放在一个文件夹下
我用阿里云盘分享了「校历.XLSX」,你可以不限速下载🚀
复制这段内容打开「阿里云盘」App 即可获取
链接:https://www.aliyundrive.com/s/TcFXhDR6pza
代码实现:
from openpyxl import load_workbook
from openpyxl.comments import Comment
# 字体,填充,宽高
from openpyxl.styles import Font,PatternFill,Alignment
# 获取需要添加备注的坐标
def get_coordinates(row_coordinate, cycle):
# 获取星期
for i in wb['A4':'A10']:
# 取行坐标
if row_coordinate == i[0].value:
if len(i[0].coordinate) == 3:
row_c = i[0].coordinate[-2:]
else:
row_c = i[0].coordinate[-1]
# 获取周次
coordinates = [] # 拼接行列坐标
for j in wb['3']:
for c in cycle: # 每周都有不同的列坐标, 获取所有的列坐标
if c == j.value:
coordinates.append(j.coordinate[0] + row_c)
return coordinates
# 给校历添加备注信息
def set_school_calendar(coordinates, message):
comment = Comment(message, author='日出林间') # 设置备注
comment.width = 185
comment.height = 120
alignment = Alignment(horizontal='left', vertical='top', wrap_text=True) # 设置宽和高
green_fill = PatternFill(fill_type='solid', fgColor="A9D08E") # 设置背景颜色
font = Font('宋体', size=14, strike=False, color='9c0006') # 设置字体样式
for coordinate in coordinates:
if wb[coordinate].value != None:
if str(wb[coordinate].comment) != 'None':
comment.text = wb[coordinate].comment.text+'\n\n'+message # 一天之内有多名课
wb[coordinate].comment = comment
wb[coordinate].comment.height = comment.height+120 # 直接修改单元格的备注
elif str(wb[coordinate].comment) == 'None':
wb[coordinate].comment = comment
wb[coordinate].alignment = alignment # 设置左对齐
wb[coordinate].fill = green_fill # 设置背景颜色
wb[coordinate].font = font # 设置字体颜色
if __name__ == '__main__':
for i in get_class_schedule():
coordinates = get_coordinates(i[0],i[1])
set_school_calendar(coordinates, i[-1])
ws.save('校历.xlsx')
print('完成,文件名是:校历')
新手发布文章,如有错误请求指教!!!
另外如果有其他学校需要并且喜欢这样的方式查看课表也可以帮忙呦~~
微信小程序和网页版本正在开发中…