python模拟登录中国海洋大学教务系统(青果)- 爬取学期所有专业课至excel - 并进行课表排课(二)

本文主要是介绍python模拟登录中国海洋大学教务系统(青果)- 爬取学期所有专业课至excel - 并进行课表排课(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本章内容包含python爬取中国海洋大学教务系统 2021年秋季学期 2018-2020年级所有计算机专业课 至excel。

系列文章目录

第一章 python模拟登录中国海洋大学教务系统(青果)
第二章 爬取学期所有专业课至excel
第三章 课表排课


本来只是想爬个课表,排个课,可惜不能直接爬,需要登录上教务网站,所以就有了第一篇文章。

文章目录

  • 系列文章目录
  • 前言
  • 一、将表格内容写入excel
  • 二、使用循环,爬取2018-2020级的专业课
  • 三、全部代码及运行效果
  • 四、遇到的问题
  • 总结


前言

第一篇已经实现了登录教务网站,并跳转至选课页面,同时也有了页面表格输出。

因为是转专业,每次进入都要选择目标专业,还要选目标年级,很麻烦,所以想一次性把2018级到2020级的专业课都爬下来,之后再用算法排课。


一、将表格内容写入excel

1.先观察选课页面的表格

请添加图片描述
表格中有两列”教学大纲“”教学日历“一直是空的,所以没必要爬下来

再根据上一章爬下来的内容,可以知道表格中有几列隐藏列也是空的,,所以也没必要爬


需要安装库 pip install openpyxl

Python官方库一般使用xlrd库来读取Excel文件,使用xlwt库来生成Excel文件,使用xlutils库复制和修改Excel文件,这三个库只支持到Excel2003。
第三方库openpyxl(可读写excel表),专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间转换容易。

该部分代码:

from openpyxl import load_workbook,Workbookdef get_data(session):
...
...table_node = soup.find_all('td')for table in table_node:if table.has_attr('style') == False:    #不是隐藏列if table.text != "教学大纲" and table.text != "教学日历":if table.has_attr('name'):    #具有属性nameif table['name'] != "jxdg" and table['name'] != "jxrl":      #不是空列sheet.cell(a,b,table.text)      #写入表格else: 				#不具有属性namesheet.cell(a,b,table.text)      #写入表格
...if __name__ == '__main__':try:wb = load_workbook('排课.xlsx')	#加载薄except:wb = Workbook()                 #新建薄sheet = wb.active	#打开簿中第一个表#sheet = wb.create_sheet()	#新建表
...wb.save('排课.xlsx')

二、使用循环,爬取2018-2020级的专业课

循环,传参sel_nj-选择的年级

主要是声明两个全局变量,控制行和列

变量只是一个普通变量,首先在函数外部进行初始化,然后在函数内部通过global关键字呼叫这个变量,就可以实现全局变量的功能了。 ——python中的全局变量(global关键字)

该部分代码:

a=1
b=1def get_data(session, sel_nj):	#选择的年级global aglobal bformdata={
...'sel_nj': sel_nj,#选择的年级2018-2020
...}
...
...for table in table_node:if table.has_attr('style') == False:    #不是隐藏列if table.text != "教学大纲" and table.text != "教学日历":if table.has_attr('name'):    #具有属性nameif table['name'] != "jxdg" and table['name'] != "jxrl":      #不是空列sheet.cell(a,b,table.text)      #写入表格b=b+1	#列加一if table['name'] == "bz":   #该换行了 b=1	#第一列a=a+1	#行加一else:						#不具有属性namesheet.cell(a,b,table.text)      #写入表格b=b+1if table.text == "备注":   #该换行了 b=1a=a+1...
def logon():
...for i in range(2018,2021):get_data(session,i)
...

三、全部代码及运行效果

import requests
from aip import AipOcr
import base64
from hashlib import md5
import json
import re
from bs4 import BeautifulSoup
from time import time#创建新薄 新表
from openpyxl import load_workbook,Workbooka=1
b=1
headers = {'Host': 'jwgl.ouc.edu.cn','Origin': 'http://jwgl.ouc.edu.cn','Referer': 'http://jwgl.ouc.edu.cn/cas/login.action','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36','X-Requested-With': 'XMLHttpRequest','Upgrade-Insecure-Requests': '1',
}#data和headers一样,并没有传全部的项
data = {'randnumber': 'gqzd'
}
#百度智能云-文字识别
def randnumber_ocr(image):APP_ID = ''  # 在百度官网的应用列表中查看APP_IDAPI_KEY = ''  # 在百度官网的应用列表中查看API_KEYSECRET_KEY = ''  # 在百度官网的应用列表中查看SECRET_KEYclient = AipOcr(APP_ID, API_KEY, SECRET_KEY)text = client.basicAccurate(image)if text['words_result_num'] == 1:return text['words_result'][0]['words'].strip()else:return ''def get_data(session, sel_nj):global aglobal burl = 'http://jwgl.ouc.edu.cn/taglib/DataTable.jsp?tableId=6146'
#这个data包含了所有项,但有些其实的非必须的formdata={'initQry': '0','xktype': '2',#选课类型'xh': '',#你的学号'xn': '2021',#学年'xq': '1',#学期-夏0-秋1-春2'nj': '',#你的年级'zydm': '',#你的专业代码'items': '','xnxq': '2021-1',#学年-学期'kcfw': 'Specialty',#课程范围'sel_nj': sel_nj,#选择的年级2018-2020'sel_zydm': '0011',#选择的专业代码'sel_schoolarea': '','sel_cddwdm': '','sel_kc': '','kcmc': ''}
#这个headers必须包含Refererheaders['Referer'] = 'http://jwgl.ouc.edu.cn/student/wsxk.kcbcx.html?menucode=JW130414'
#使用sessionr = session.post(url,data=formdata, headers=headers)soup = BeautifulSoup(r.text, 'html.parser')table_node = soup.find_all('td')for table in table_node:if table.has_attr('style') == False:    #不是隐藏列if table.text != "教学大纲" and table.text != "教学日历":if table.has_attr('name'):    #具有属性nameif table['name'] != "jxdg" and table['name'] != "jxrl":      #不是空列sheet.cell(a,b,table.text)      #写入表格b=b+1if table['name'] == "bz":   #该换行了 b == 15:#23b=1a=a+1else:sheet.cell(a,b,table.text)      #写入表格b=b+1if table.text == "备注":   #该换行了 b == 15:#23b=1a=a+1session.close()def logon():start = time()url = 'http://jwgl.ouc.edu.cn/cas/logon.action'username = ''  # 输入你的用户名,也就是学号password = ''  # 输入你的密码session = requests.Session()#百度智能云-文字识别-获取验证码    randnumber = ''while len(randnumber) != 4:r = session.get('http://jwgl.ouc.edu.cn/cas/genValidateCode', headers=headers)      randnumber = randnumber_ocr(r.content).replace(' ','')#去除空格#构造data-信息加密        password = md5(password.encode('utf-8')).hexdigest()randnumber_s = md5(randnumber.lower().encode('utf-8')).hexdigest()password = md5((password + randnumber_s).encode('utf-8')).hexdigest()
#sessionid是会话的id,一般是存放在cookie中_sessionid = session.cookies.get_dict()['JSESSIONID']username = base64.b64encode(username.encode('utf-8') + b';;' + str(_sessionid).encode('utf-8'))
#randnumber会在之前通过百度智能云文字识别获得data['randnumber'] = randnumberp_username = '_u' + randnumberp_password = '_p' + randnumberdata[p_username] = usernamedata[p_password] = password
#post    r = session.post(url, data=data, headers=headers)
#response    info = json.loads(r.text)status = info['status']if status == '401':print('验证码错误')returnelif status == '200':passelse:print(info['message'])returnprint('登录成功')for i in range(2018,2021):get_data(session,i)end = time()print('总共用时' + str(end - start))if __name__ == '__main__':try:wb = load_workbook('排课.xlsx')	#加载薄except:wb = Workbook()                 #新建薄sheet = wb.active	#打开簿中第一个表#sheet = wb['biaoge_name']	#打开薄中 名字为biaoge_name的表#sheet = wb.create_sheet()	#新建表logon()wb.save('排课.xlsx')

在这里插入图片描述

四、遇到的问题

TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

没连 VPN

    wb= load_workbook('排课.xlsx')#加载薄
NameError: name 'load_workbook' is not defined

要 from openpyxl import load_workbook

    wb.creat_sheet('xinbiao2')
AttributeError: 'Workbook' object has no attribute 'creat_sheet'

create_sheet 拼写错误

	sheet.cell(a,b,table.text)
ValueError: Row or column values must be at least 1

cell 的行和列都要从1开始

KeyError: 'name'

这种 KeyError 错误一般都是因为没有这个东西,
以本程序为例,有些table含有name属性,有些不含,如果不加判断的去写就会报错

只能是 tag.text 和 tag[‘id’]、tag[‘name’]
这个不太确定,看别人有用 tag.id/name
但本程序是 tag.id/name = None


总结

1.全局变量,首先在函数外部进行初始化,然后在函数内部通过global关键字呼叫这个变量。
·a=1·
·def func:·
········global a·

2.python没有a++
·a=a+1·

3.进行解析后,Tag是否具有某种属性
·if table.has_attr('name'): #具有属性name·

4.筛选具有某种属性的Tag
关于python:测试BeautifulSoup中的标签中是否存在属性
·script_tags = soup.find_all('script', some_attribute=True)·

·script_tags = soup.find_all('script', {"some-data-attribute": True})·

5.为什么要from … import …
python中为什么大佬都爱用from import
因为导入包名其实是无法直接使用包内的子包和模块的

6.openpyxl
python之openpyxl模块

openpyxl中有三个不同层次的类Workbook是对工作簿的抽象Worksheet是对表格的抽象Cell是对单元格的抽象每一个类都包含了许多属性和方法
Excel基本操作打开或者创建一个Excel,需要创建一个Workbook对象使用Workbook对象的方法来得到一个Worksheet对象得到Worksheet对象以后再从中获取代表单元格的Cell对象

常用:

·wb = load_workbook('排课.xlsx') #加载薄·

·wb = Workbook() #新建薄·

·sheet = wb.active #打开簿中第一个表·

·sheet = wb['biaoge_name'] #打开薄中 名字为biaoge_name的表·

·sheet = wb.create_sheet() #新建表·

·sheet.cell(行,列,内容) #修改单元格内容·

·wb.save('排课.xlsx') #保存薄·

收获多多 \OoO/

码字不易,感谢点赞评论收藏关注~

这篇关于python模拟登录中国海洋大学教务系统(青果)- 爬取学期所有专业课至excel - 并进行课表排课(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/849508

相关文章

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程