zl程序教程

您现在的位置是:首页 >  其他

当前栏目

爬取正方教务系统课程表

2023-04-18 14:43:24 时间

被一个学长布置下的任务…有些地方可能不够完整…
思路: 首先你需要完成登录操作:
(1) 首先根据教务系统网站的审查元素, 发现了一个验证码的网址:http://210.40.2.253:8888/(fw5xjvfovnf3f4zg1ikero2a)/CheckCode.aspx
进去后你会发现,这里面的验证码是会随着时间的变化而变化的,那这样子该怎么办呢?(果断百度一波!!)
然后巴拉巴拉… 大概就是说验证码的核对是与你的cookies有关的,那么这个东西要怎么获得呢,
request第三方库中提供了一个session , 这个就是相当于代码中的一个浏览器,在你请求http的时候会自动帮你保存你的cookies的值,这样子就可以完成验证码的匹配操作了 。
具体一点:
先创建一个session对象
然后向验证码页面发送get请求(这时你的cookies就有了)
然后向教务系统页面发送post请求(提交账号密码验证码)
这时,你就登录成功了(前提是提交的东西要正确= =)
(2) 爬取课程表
登录进去后,我们继续我们的审查元素,在其中找到了向课程表页面发送post请求的地址:
http://210.40.2.253:8888/xskbcx.aspx?xh=1717000113&xm=֣����&gnmkdm=N121603
其中 xh 是 学号 , xm 是学生姓名的url编码 , gnmkdm是课程表页面的代码
这些信息是获得课表页面的学生信息,会显示出你是哪里的学生,学号是什么,专业是什么等等之类的
这些东西我们需要想办法获得,也就是说,只有得到了这些信息,我们才能方便向课表页面发送post请求
那么应该怎么获得?
(1) 先发送一个get请求 http://210.40.2.253:8888/xskbcx.aspx?xh="+ user_name+ "&gnmkdm=N121603
(2) 然后运用bs4库去提取http网页中的学生信息(参考代码)
(3)得到后向课表页面发送post请求(哪一年第几学期)
(4) 然后便得到了我们的课程表页面, 接下来就可以进行信息提取了

其实只要登录进去了,里面的成绩,课表,选课什么的都是可以以一种模拟人的办法进行操作

import requests from bs4 import BeautifulSoup session = None checkcodePath = './code.png' #验证码保存路径 res = requests.Session() Origin_url = "http://210.40.2.253:8888/(fw5xjvfovnf3f4zg1ikero2a)/" # 教务系统网址 url = "http://210.40.2.253:8888/default2.aspx" checkcodeURL = Origin_url+'CheckCode.aspx' #验证码网址 head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0","Connection": "keep-alive", "Referer":"http://210.40.2.253:8888/default2.aspx"} post_data = {"__VIEWSTATE":"dDwtNTE2MjI4MTQ7Oz4I55DQ6KPcVdzTLmjGjlJPRWgYUQ==","Textbox1" : "" ,"txtSecretCode":"","RadioButtonList1":"%D1%A7%C9%FA","Button1":"","lbLanguage":"","hidPdrs":"","hidsc":""} def get_photo(URL): checkcode = res.get(checkcodeURL, headers=head) with open(checkcodePath, 'wb') as fp: #保存验证码图片 fp.write(checkcode.content) post_data['txtSecretCode'] = input("请输入图片中的验证码: (验证码图片保存在同级文件夹)")

def login(): user_name = input("请输入您的学号:") user_password = input("请输入您的密码:") post_data["txtUserName"] = user_name post_data["TextBox2"]= user_password login_page_url = Origin_url + "default2.aspx" head['Referer'] = login_page_url get_photo(url) homePage = res.post(login_page_url, data=post_data, headers=head) #在这里得到了主页面 with open('text1.html','w' , encoding = 'gb2312') as f : f.write(homePage.text) #更改数据 #head["Referer"]="http://210.40.2.253:8888/(fw5xjvfovnf3f4zg1ikero2a)/default2.aspx" exit_sys = "what should i do " URL = "http://210.40.2.253:8888/xskbcx.aspx?xh="+ user_name+ "&gnmkdm=N121603" #URL = "http://210.40.2.253:8888/xskbcx.aspx?xh=1717000113&xm=%D6%A3%BC%CE%F3%DE&gnmkdm=N121603 head["Referer"]= URL

page_home = res.get(URL , headers = head) post_data["__VIEWSTATE"] = BeautifulSoup(page_home.text, 'html.parser').find_all('input')[2].get('value') #xm = BeautifulSoup(res.get(URL , headers = head).text, 'html.parser').find_all('form')[0].get('action') post_data["__EVENTTARGET"] = "xqd" while exit_sys != "q": query_years = input("请输入您要查询课表的年份:(2017-2018)") query_how = input("请输入您要查询第几学期的课表:")

#URL = "http://210.40.2.253:8888/" + xm #print(URL) post_data["xnd"]= query_years post_data["xqd"]=query_how

learning = res.post(URL , data = post_data , headers = head) print(URL) if query_years == "2018-2019" and query_how == "1" : with open( query_years + '-'+ query_how + '.html' ,'w' , encoding = "gb2312") as f : f.write(page_home.text) else : with open( query_years + '-'+ query_how + '.html' ,'w' , encoding = "gb2312" , errors = "ignore") as f : f.write( learning.text) print("您的课表已经保存为html的形式!") print("按q退出 按c继续") while 1 : exit_sys = input() if exit_sys == "c" or exit_sys == 'q' : break else: print("无效操作!") return learning def class_table(table_html): pass

def main(): res = login() class_table(res) if __name__ == "__main__": main()