python爬虫获取郑大教务在线成绩数据

话不多说,先上代码。

# -*- coding: cp936-*-
#! /usr/bin/env python
#---------------------------------------  
#   程序:郑州大学教务在线数据获取 
#   版本:0.5  
#   作者:陆嵩&潘凎  
#   日期:2016-2-20  
#   语言:Python 2.7  
#   操作:输入你的年级、学号和密码  
#   功能:将你每一学期的成绩打包txt存储到本地。  
#---------------------------------------
import urllib
import urllib2
import re
from bs4 import BeautifulSoup



#初始化------------------------------------
grade='2013'
sno='20132120215'
password='********'
#-----------------------------------------


#post数据&登录------------------------------
def post():
    url = 'http://jw.zzu.edu.cn/scripts/qscore.dll/search'
    values = {'nianji': grade,
            'xuehao': sno,
            'mima'  : password}
    data = urllib.urlencode(values)
    req = urllib2.Request(url,data)
    response = urllib2.urlopen(req)
    the_page = response.read()
    response.close()
    return the_page
#-----------------------------------------


#获取各学期网页源码---------------------------
def pages_get(the_page):
    urltail_format=re.compile('(?<=userid\=)[A-Z\d]+(?="\>)')
    urltails=urltail_format.findall(the_page)
    pages=[]
    for i in range(0,len(urltails)-1):
        term_url='http://jw.zzu.edu.cn/scripts/qscore.dll/search?userid='+urltails[i]
        term_page = urllib.urlopen(term_url)
        pages.append(term_page.read())
        term_page.close()
    pages.append(the_page)
    return pages
#-----------------------------------------

#从网页中抓取所需数据-------------------------
def data_collection(page):
    soup = BeautifulSoup(page,from_encoding="cp936")
    scores=str(soup.table)
    r_subject = re.compile('(?<="40%"\>).*?(?=\<\/td\>)')
    r_type = re.compile('(?<="17%"\>).*?(?=\<\/td\>)')
    r_others = re.compile('(?<="15%"\>).*?(?=\<\/td\>)')
    subjects = r_subject.findall(scores)
    types = r_type.findall(scores)
    others = r_others.findall(scores)
    length = len(subjects)
    csv = []
    for i in range(0,length):
        info = subjects[i] +','+ types[i] +','+ others[3*i] +','+ others[1+3*i] +','+ others[2+3*i] +'\n'
        csv.append(info)
    return csv
#-----------------------------------------

#数据的保存---------------------------------
def data_save(data,file_name):
    file_object = open('D:\\'+file_name, 'w+')
    file_object.writelines(data)
    file_object.close()
#-----------------------------------------


##---------------主程序—--------------------
if __name__ == '__main__':
    print u"""#---------------------------------------  
#   程序:郑州大学教务在线成绩数据获取 
#   版本:0.5  
#   作者:陆嵩  
#   日期:2016-2-20  
#   语言:Python 2.7  
#   操作:输入你的年级、学号和密码  
#   功能:将你每一学期的成绩打包txt存储到本地。  
#---------------------------------------
"""
    the_page=post()
    pages=pages_get(the_page)
    for i in range(0,len(pages)):
        print u'获取第'+str(i+1)+u'学期数据中...'
        data=data_collection(pages[i])
        file_name='第'+str(i+1)+'学期.txt'
        data_save(data,file_name)
    print u'完成!数据保存D盘,请注意查看。'
#-------------------------------------------

  • 程序浅显易懂,就不多说了。
  • 需要事前先安装好BeautifulSoup模块。
  • 初始化部分分别输入你的账号密码。
  • 此程序仅适合郑州大学教务在线。若您做一个自己学校的,需要对程序做小改动。主要是在post和pages_get模块。当然,有些学校还要求验证码,网上有很多参考。
  • for i in range(0,5)则i的取值为0,1,2,3,4而不包括5。
  • if __name__ == '__main__':的作用是说明若在当前程序下运行而不是调用,则执行以下代码。
  • 更多内容,参考链接1链接2链接3
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐