Python —爬取教务管理系统,个人成绩

Python —爬取教务管理系统,个人成绩_第1张图片

打开chrome的按F12进入,选择network,勾上preserve log(为了保存中间过程),输入上图的用户名密码,点击登陆。


Python —爬取教务管理系统,个人成绩_第2张图片


比如POST方法或者查看login.aspx,这个就是我们提交表单的信息了,点进去拖到最下方可以看到form data,

可以看到提交的用户名密码,接下来只需代码模拟登陆的话把提交这个data里的信息就可以了。

下图的,本人学校的登入的用户名密码的表单。


Python —爬取教务管理系统,个人成绩_第3张图片


登入进去后,为了爬取成绩需要转到成绩页面,不过不管怎么点击其他页面按键,发现网址始终不变:xxx.xxx.edu.cn/Index.aspx。

这是什么原理,目前还不太懂。不过chrome的network,勾上preserve log(为了保存中间过程),点击成绩查询,又收到2个文件。


Python —爬取教务管理系统,个人成绩_第4张图片

cjcx:就是“成绩查询”的缩写,Request URL就是真实的地址。

所以真实的成绩查询地址不是:xxx.xxx.edu.cn/Index.aspx,而是:xxx.xxx.edu.cn/cjgl/xs_cjcx.aspx。

接下来,就需要用到cookie登入,然后正则表达式(各个学校不一样),匹配信息,并写入test.txt文件。

正则表达式,自己看了几个网页粗粗的学了下,没有学到家,可以匹配出所有的成绩,但是还是会匹配出一些垃圾信息出来。


Python —爬取教务管理系统,个人成绩_第5张图片Python —爬取教务管理系统,个人成绩_第6张图片


下面就是代码部分:

#encoding=utf-8
 
import urllib
import urllib2
import cookielib
import re
import string

file_name1=r'C:\Users\112\Desktop\test.txt'
e = open(file_name1,'w+')

#绩点运算
class SDU:
    #类的初始化
    def __init__(self):
        #登录URL
        self.loginUrl = 'http://XXX.XXX.edu.cn/login.aspx'
        #本学期成绩URL
        self.gradeUrl = 'http://XXX.XXX.edu.cn/cjgl/xs_cjcx.aspx'
        self.cookies = cookielib.CookieJar()
        self.postdata = urllib.urlencode({
            'muser':'151100000',
            'passwd':'12345678'
         })
        self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'}  
	#构建opener
        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))
        #学分list
        self.credit = []
        #成绩list
        self.grades = [] 
		
    def getPage(self):
        request  = urllib2.Request(
            url = self.loginUrl,
            data = self.postdata,
            headers = self.headers) 
        result = self.opener.open(request)
        result = self.opener.open(self.gradeUrl)
        #打印登录内容
        #print result.read()
        page = result.read()
        print page
		#替换内容
        page = page.replace('','')
        page = page.replace('','')
        #正则匹配
        st= re.compile(r'.*?(.*?).*?(.*?).*?(.*?)(.*?)(.*?)(.*?)(.*?)')
        myItems3 = re.findall(st,page)
        print myItems3
        for item3 in myItems3:
          for i in range(7):
            e.write(item3[i]+'   ')
            print item3[i]
          e.write('\n \n ')
  
       
 
sdu = SDU()
sdu.getPage()
e.close()


你可能感兴趣的:(python)