0x00 前言
为什么会想到做这个呢?今年4月初的时候要填学业指导表,于是查教务系统的课程编号,各种ctrl+c和ctrl+v,看公式手算gpa,做完这些起码要花半个多小时,工程比较繁琐。
![41e241f62e0d255d25ddbd1905e323c6.png](https://i-blog.csdnimg.cn/blog_migrate/5be1115d62ac2103272eefa026638802.jpeg)
当时就萌生了一个想法,要是直接给我生成个学业指导表就好了,不用花那么多时间和功夫去做这个。
但是学校又没有提供直接生成学业指导表的工具,那只能自己想办法写一个了,我对Python比较熟,决定用Python来写,然后可以用Python的request+docx两个库,request负责获取信息,docx生成关键文档,request后再加个解析请求的BeautifulSoup库,觉得可行性很高,便把想法定了下来。
![ac89bfbfc1af99b3e0350bb7935d6889.png](https://i-blog.csdnimg.cn/blog_migrate/c7427e3415dd2118846492e87e56361b.jpeg)
![bbc70c681a77a895a3ece5fcc92aef48.png](https://i-blog.csdnimg.cn/blog_migrate/aceb7e199d032095aa456c0da1ee0c0b.png)
![84cd727a11679c54a26a10afa781833e.png](https://i-blog.csdnimg.cn/blog_migrate/2056a73cb8594d815ae071efe58df9ec.png)
![30cde101eddeffbdb2c966e1c01e481f.png](https://i-blog.csdnimg.cn/blog_migrate/7ede8006a8c29a1f5def37fc962daede.jpeg)
python main.py studentid password
![05d48fa823a49d5e6a1d4d955dba5a45.png](https://i-blog.csdnimg.cn/blog_migrate/9c74c5612cf4113e8c01ffa76ae8b23f.png)
![b5dc79c23d20fdcbb833e0b249bcffbd.png](https://i-blog.csdnimg.cn/blog_migrate/4ee4ec8c1845617b7a2cea1b17edeba8.jpeg)
![bcd42858704ac6a0680d31dc6e8ff270.png](https://i-blog.csdnimg.cn/blog_migrate/b36fa6518e68b4ad750656539cd7770f.png)
![946fa2dd6d367e4b9a69431220852ded.png](https://i-blog.csdnimg.cn/blog_migrate/adc8fc5b019c82327feabd15219464e7.png)
![4140854db0cef14caae6fd52a3ea9c23.png](https://i-blog.csdnimg.cn/blog_migrate/de4cf62fa1312250ce55f502c9acbab4.jpeg)
----
怎么用python来实现这个呢,暂时可以分为两步:
获取所需的数据
利用获取的数据生成一个docx文档
那么问题来了
![403a152bc5a5fabc7ca2f2058cbe3554.png](https://i-blog.csdnimg.cn/blog_migrate/b1637fe571a4790fdb0db7d1c72c1a28.jpeg)
我们要哪些数据呢?
又能从哪里获取到呢?
获取到后又要怎样处理呢?
怎么生成一个docx文档?
文档的表格又该如何处理?
文档又如何写入数据
![a04c66226aff569879969bccb54b08a9.png](https://i-blog.csdnimg.cn/blog_migrate/1cc95bc4a4c44e13f454bbd3f39f2725.jpeg)
0x01 获取接口
数据从哪获取?这是一个非常重要的问题,第一步就是寻找接口。举个简单的例子,比如我们想要获取到成绩的具体数据,去教务系统的成绩查询那里,按F12,在network那里,![f488d16f7b48a80f6744ba5077a23151.png](https://i-blog.csdnimg.cn/blog_migrate/ab459f12a4281ddb57550e82ed558efd.png)
![d2984de4ac768aea1b433eb47933b9b9.png](https://i-blog.csdnimg.cn/blog_migrate/1d33ead9f7d473730d896e1c675b8cbd.png)
![43fbd0d6d91da2a987ed24196e423fdb.png](https://i-blog.csdnimg.cn/blog_migrate/24cfcecd3656592ef7328ec8badbf22c.png)
![1743870df0067475a39e28ba4da22537.png](https://i-blog.csdnimg.cn/blog_migrate/06c8870bbdf28a7e4c430c4208231a57.png)
![74f4368c26ea16e7615c16b87040e753.png](https://i-blog.csdnimg.cn/blog_migrate/cdf44e9ceff365d5753e97385d0d02ef.png)
Getinfo
登录
定义login函数,使用base64加密密码,cookiejar获取cookies,返回opener对象,用于模拟用户登录教务系统def login(header):
LOGIN_URL = "http://qzjw.peizheng.edu.cn/jsxsd/xk/LoginToXk"
values = {}
values['userAccoun'] = username
values['userPassword'] = ''
st = base64.b64encode(bytes(username, 'utf8')).decode(
)+'%%%'+base64.b64encode(bytes(password, 'utf8')).decode()
values['encoded'] = st
postdata = parse.urlencode(values).encode('utf-8')
cookie = cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
request = urllib.request.Request(LOGIN_URL, postdata, headers=header)
opener.open(request)
return opener
处理数据
去除成绩列表中的不需要的数据,有些数据是多余的,可以舍弃掉,对于空的数据,用正则去匹配,将null加入列表,使列表数据保持一致,方便处理def cjcx_rule(soup, flag=False, kk=False): list_test[18] = soup.find('input', id='xb')["value"] #18 性别