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

本文介绍了如何使用Python进行网络爬虫,模拟登录教务管理系统,获取个人成绩。通过分析Chrome的Network面板,找到登录所需的POST数据,并在登录成功后,探索成绩查询的真实URL。虽然正则表达式能匹配大部分成绩信息,但也会捕获一些非目标数据。

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




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

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

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




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

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



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

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

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

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




下面就是代码部分:

#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()


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值