First analyze the Web page, find the Academic Office login Verification Code
Then use Python to download the verification code directly to the local (the entire program through the Requests library implementation):
def GetRandCode(): =r‘http://jwxt.wust.edu.cn/whkjdx/verifycode.servlet‘ = foo.get(url) withopen(‘randcode.jpg‘‘wb‘asfile: file.write(ans.content)
After we find the verification code and continue to find the login API, we can find that the Web page sent a POST request, as well as the relevant parameters:
Then to implement the login is very simple, I first wrote a simple login implementation:
Foo=Foo=Requests.session () headers={"User-agent":"mozilla/5.0 (Windows NT 10.0; WOW64) applewebkit/537.36 (khtml, like Gecko) chrome/49.0.2623.110 safari/537.36 ",}defLogin (username, password, randcode): URL= R ' Http://jwxt.wust.edu.cn/whkjdx/Logon.do?method=logon 'Information={' USERNAME ': Username,' PASSWORD ': Password,' Randomcode ': Randcode} ans=Foo.post (URL, data=Information, headers=Headers) Ans.raise_for_status () ans.encoding=Ans.apparent_encodingifAns.text.find (R ' http://jwxt.wust.edu.cn/whkjdx/framework/main.jsp ')!= -1:return True Else:return False
Test the discovery can be normal login, and then to do to obtain a list of selected courses, the same way.
I found the address of this semester to get the list of courses is http://jwxt.wust.edu.cn/whkjdx/xkglAction.do?method=toFindxskxkclb&xnxq01id=2017-2018-2&zzdxklbname=1&type=1&jx02kczid=null
very obvious parameter xnxq01id
should be the semester number, the rules are easy to find. Then I implemented it directly in Python and found that the Web page returned a message with no access rights. Go back and analyze the login process, find an API for SSO (Point-to-point login), and try a new login function:
defLogin (username, password, randcode): URL= R ' Http://jwxt.wust.edu.cn/whkjdx/Logon.do?method=logon 'Ssourl= R ' Http://jwxt.wust.edu.cn/whkjdx/Logon.do?method=logonBySSO 'Information={' USERNAME ': Username,' PASSWORD ': Password,' Randomcode ': Randcode} ans=Foo.post (URL, data=Information, headers=Headers) Ans.raise_for_status () ans.encoding=Ans.apparent_encoding Ans2=Foo.post (Ssourl, headers) ans2.raise_for_status ()ifAns.text.find (R ' http://jwxt.wust.edu.cn/whkjdx/framework/main.jsp ')!= -1:return True Else:return False
With the new login function, you can get a list of elective courses normally. The specific implementation is as follows:
defGetcourseslist (): URL= R ' http://jwxt.wust.edu.cn/whkjdx/xkglaction.do?method=tofindxskxkclb&xnxq01id=2017-2018-2& Zzdxklbname=1&type=1&jx02kczid=null 'Ans=Foo.get (URL, headers=Headers) Ans.raise_for_status () ans.encoding=Ans.apparent_encoding courseslist=Re.findall (R ' <td height= "style=" text-overflow:ellipsis; white-space:nowrap; overflow:hidden; width= "\d+" title= " . *" ', Ans.text) xkljlist=Re.findall ("Javascript:vjsmod\ (\ '.*\ '", Ans.text) KeyName=[' KCMC ',' KKDW ',' Zyfx ',' XF ',' Yxrs ',' YL ',' Skjs ',' Skzc ',' SKSJ ',' SKDD ',' KCSX ',' Kcxz ',' Fzm ',' Xbyq '] Result=[] Item={} bar= 0Index= 0 forIinchCourseslist:left=I.find (R ' title= "') Right=I[left+ 7:].find (R ' "') text=I[left+ 7: Left+Right+ 7]#print (i) #print (text)Item[keyname[bar]]=Text Bar=Bar+ 1 if(Bar== -): Left=Xkljlist[index].find ("'") Right=Xkljlist[index][left+ 1:].find ("'") text=Xkljlist[index][left+ 1: Left+Right+ 1] Item[' Xklj ']=Text Index=Index+ 1Result.append (item) Item={} bar= 0 returnResult
Where the regular expression matches all the information in the Web page list, each 14 items is a course of all the information, the specific information corresponding to which, you can look at the table header, I use a dictionary to save the information of these courses, and then saved to a list, each message of the phonetic shorthand is the dictionary of the corresponding key name, and then there is a xklj
the link used to save the selected lesson needs to be get
accessed, so that the choice of course is very simple, only need to send a request to this link get
:
def ChoseCourseByLink(link): =‘http://jwxt.wust.edu.cn‘+ link == headers) ans.raise_for_status() = ans.apparent_encoding return ans.text
Then use the same method to construct the credit-system list of elective courses:
defGetCoursesList2 (): URL= R ' http://jwxt.wust.edu.cn/whkjdx/xkglaction.do?method=tofindxskxkclb&xnxq01id=2017-2018-2& Zzdxklbname=6&type=1&jx02kczid=null 'Ans=Foo.get (URL, headers=Headers) Ans.raise_for_status () ans.encoding=Ans.apparent_encoding courseslist=Re.findall (R ' <td height= "style=" text-overflow:ellipsis; white-space:nowrap; overflow:hidden; width= "\d+" title= " . *" ', Ans.text) xkljlist=Re.findall ("Javascript:vjsmod\ (\ '.*\ '", Ans.text) KeyName=[' KCMC ',' KKDW ',' Zyfx ',' XF ',' Yxrs ',' YL ',' Skjs ',' Skzc ',' SKSJ ',' SKDD ',' KCSX ',' Kcxz ',' Fzm ',' Xbyq '] Result=[] Item={} bar= 0Index= 0 forIinchCourseslist:left=I.find (R ' title= "') Right=I[left+ 7:].find (R ' "') text=I[left+ 7: Left+Right+ 7]#print (i) #print (text)Item[keyname[bar]]=Text Bar=Bar+ 1 if(Bar== -): Left=Xkljlist[index].find ("'") Right=Xkljlist[index][left+ 1:].find ("'") text=Xkljlist[index][left+ 1: Left+Right+ 1] Item[' Xklj ']=Text Index=Index+ 1Result.append (item) Item={} bar= 0 returnResult
Such a simple library of lessons to be achieved, the time to grab a lesson only need to call the relevant interface on the line, and finally all the code on my Github: https://github.com/Rugel/wustjwxt
Using Python to automate the course of teaching at the Hkust academic Office