爬虫模拟登陆校园网并抓取作业

首先打开校园网的网络教学平台http://eol.zhbit.com/homepage/common/

爬虫模拟登陆校园网并抓取作业_第1张图片


找到相应的表单代码

爬虫模拟登陆校园网并抓取作业_第2张图片

用户名的name是IPT_LOGINUSERNAME

密码的name是IPT_LOGINPASSWORD

提交的地址是http://www.zhbit.com/homepage/common/login.jsp

通过浏览器的抓包发现确实只有这两个数据提交

 


提交成功后页面变成这样

爬虫模拟登陆校园网并抓取作业_第3张图片

点击进入

爬虫模拟登陆校园网并抓取作业_第4张图片

发现地址已经变成http://eol.zhbit.com/main.jsp

所以我们的爬虫程序模拟登陆成功之后还需要进入这个地址 


进入这个界面之后,我们看到有许多门学科(数据库,面向对象,模拟电子技术)

每个学科都有相应的链接

同样我们找相应的代码

爬虫模拟登陆校园网并抓取作业_第5张图片


根据上面的分析可以写出下面的程序

#coding=GBK
import re
import urllib
import urllib2
import cookielib

#设置浏览器的cookie
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#表单数据
postdata=urllib.urlencode({
    'IPT_LOGINUSERNAME':'你的学号',#学号
    'IPT_LOGINPASSWORD':'你的密码'#密码
})
#设置表单的目标地址
req = urllib2.Request(
    url = 'http://eol.zhbit.com/homepage/common/login.jsp',
    data = postdata
)
result = opener.open(req)
htmlflag = result.read()
#匹配“欢迎登陆”的字符验证是否登陆成功
pattern = re.compile(r'欢迎登录!')
search = pattern.search(htmlflag)
if search:
    #登陆成功后跳转到'http://eol.zhbit.com/main.jsp'
    result = opener.open('http://eol.zhbit.com/main.jsp')
    #读取该页面的html并存储到homeHtml
    homeHtml = result.read()
    #编写正则表达式匹配需要获得的内容
    pattern = re.compile(r'<a href="javascript:void\(0\)".*?'+
                         'onclick="changecourse\(\'.(.*?)\'\)"'+
                         '.*?\n.*?'+'title="(.*?)">')
    mainList = pattern.findall(homeHtml)
    for m in mainList:
        print m[0].decode('gbk')+" "+m[1].decode('gbk')
else:
    print "登陆错误"

运行成功后的结果(这个是我的课程)

/stu_left_course_menu.jsp?lid=24063 数据库应用技术 [02102100]
/stu_left_course_menu.jsp?lid=26510 面向对象程序设计(C++) [02120011]
/stu_left_course_menu.jsp?lid=26512 模拟电子技术 [02120021]
/stu_left_course_menu.jsp?lid=26902 大学英语(B)2 [10120111]
/stu_left_course_menu.jsp?lid=22771 大学物理实验1 [12110180]
/stu_left_course_menu.jsp?lid=27185 大学物理(D)1 [12120041]
/stu_left_course_menu.jsp?lid=27195 高等数学(B)2 [12120290]
/stu_left_course_menu.jsp?lid=23231 野外生存技能 [13120300]
/stu_left_course_menu.jsp?lid=27275 军训与军事理论教育 [21120001]
/stu_left_course_menu.jsp?lid=27350 西方文明通论 [39100300]

我在程序里输出了m[0]和m[1]分别是课程对应的地址和课程的名称,课程对应的地址是相对路径

下面我们打开数据库那个课程

#打开数据库页面的地址
dataBaseurl = "http://eol.zhbit.com/stu_left_course_menu.jsp?lid=24063"
result = opener.open(dataBaseurl)


使用浏览器打开数据库的页面

爬虫模拟登陆校园网并抓取作业_第6张图片


找到课程作业的链接

#打开课程作业页面的地址
result = opener.open('http://eol.zhbit.com/common/hw/student/hwtask.jsp')
#读取数据库页面的html并存储到dataBaseHtml
dataBaseHtml = result.read()
pattern = re.compile(r'<td align="left"><a href="hwtask.view.jsp.*?class="infolist">(.*?)</a></td>')
hw = pattern.findall(dataBaseHtml)
pattern2 = re.compile(r'<td>(.*?)年(.*?)月(.*?)日</td>')
ti = pattern2.findall(dataBaseHtml)
t = 0
for h in hw:
    print(h.decode('gbk') +
            ' 截止日期'.decode('gbk') + ti[t][0].decode('gbk') +
            '年'.decode('gbk') + ti[t][1].decode('gbk') +
            '月'.decode('gbk') +ti[t][2].decode('gbk') +
            '日'.decode('gbk'))
    t += 1

运行结果

/stu_left_course_menu.jsp?lid=24063 数据库应用技术 [02102100]
/stu_left_course_menu.jsp?lid=26510 面向对象程序设计(C++) [02120011]
/stu_left_course_menu.jsp?lid=26512 模拟电子技术 [02120021]
/stu_left_course_menu.jsp?lid=26902 大学英语(B)2 [10120111]
/stu_left_course_menu.jsp?lid=22771 大学物理实验1 [12110180]
/stu_left_course_menu.jsp?lid=27185 大学物理(D)1 [12120041]
/stu_left_course_menu.jsp?lid=27195 高等数学(B)2 [12120290]
/stu_left_course_menu.jsp?lid=23231 野外生存技能 [13120300]
/stu_left_course_menu.jsp?lid=27275 军训与军事理论教育 [21120001]
/stu_left_course_menu.jsp?lid=27350 西方文明通论 [39100300]
2014-2015-2上机实验7-宏 截止日期2015年7月7日
2014-2015-2上机实验6-报表 截止日期2015年6月22日
2014-2015-2上机实验5 截止日期2015年6月6日
期末考试相关资料上传 截止日期2015年7月6日
2014-2015-2上机实验4 截止日期2015年5月18日
2014-2015-2上机实验3 截止日期2015年5月11日
2014-2015-2上机实验2 截止日期2015年5月4日
2014-2015-2上机实验1 截止日期2015年4月30日


获取数据库作业总代码

#coding=GBK
import re
import urllib
import urllib2
import cookielib

#设置浏览器的cookie
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#表单数据
postdata=urllib.urlencode({
    'IPT_LOGINUSERNAME':'你的学号',#学号
    'IPT_LOGINPASSWORD':'你的密码'#密码
})

#设置表单的目标地址
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'   
headers = { 'User-Agent' : user_agent }   
req = urllib2.Request(url = 'http://eol.zhbit.com/homepage/common/login.jsp',
                    data = postdata, headers = headers)
result = opener.open(req)
htmlflag = result.read()
#匹配“欢迎登陆”的字符验证是否登陆成功
pattern = re.compile(r'欢迎登录!')
search = pattern.search(htmlflag)
if search:
    #登陆成功后跳转到'http://eol.zhbit.com/main.jsp'
    result = opener.open('http://eol.zhbit.com/main.jsp')
    #读取该页面的html并存储到homeHtml
    homeHtml = result.read()
    #编写正则表达式匹配需要获得的内容
    pattern = re.compile(r'<a href="javascript:void\(0\)".*?'+
                         'onclick="changecourse\(\'.(.*?)\'\)"'+
                         '.*?\n.*?'+'title="(.*?)">')
    mainList = pattern.findall(homeHtml)
    for m in mainList:
        print m[0].decode('gbk')+" "+m[1].decode('gbk')
    #打开数据库页面的地址
    dataBaseurl = "http://eol.zhbit.com/stu_left_course_menu.jsp?lid=24063"
    result = opener.open(dataBaseurl)
    result = opener.open('http://eol.zhbit.com/common/hw/student/hwtask.jsp')
    #读取课程作业页面的html并存储到dataBaseHtml
    dataBaseHtml = result.read()
    pattern = re.compile(r'<td align="left"><a href="hwtask.view.jsp.*?class="infolist">(.*?)</a></td>')
    hw = pattern.findall(dataBaseHtml)
    pattern2 = re.compile(r'<td>(.*?)年(.*?)月(.*?)日</td>')
    ti = pattern2.findall(dataBaseHtml)
    t = 0
    for h in hw:
        print(h.decode('gbk') +
              ' 截止日期'.decode('gbk') + ti[t][0].decode('gbk') +
              '年'.decode('gbk') + ti[t][1].decode('gbk') +
              '月'.decode('gbk') +ti[t][2].decode('gbk') +
              '日'.decode('gbk'))
        t += 1
        
else:
    print "登陆错误"

注:中文后面加.decode('gbk'),是因为在linux下中文是用utf-8输出的,而校园网是GBK编码的所以需要经过解码。在windows下不需要加!!


只要修改一下程序就可以获取全部作业了

#coding=GBK
import re
import urllib
import urllib2
import cookielib

#设置浏览器的cookie
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#表单数据
postdata=urllib.urlencode({
    'IPT_LOGINUSERNAME':'你的学号',#学号
    'IPT_LOGINPASSWORD':'你的密码'#密码
})

#设置表单的目标地址
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'   
headers = { 'User-Agent' : user_agent }   
req = urllib2.Request(url = 'http://eol.zhbit.com/homepage/common/login.jsp',
                    data = postdata, headers = headers)
result = opener.open(req)
htmlflag = result.read()
#匹配“欢迎登陆”的字符验证是否登陆成功
pattern = re.compile(r'欢迎登录!')
search = pattern.search(htmlflag)
if search:
    #登陆成功后跳转到'http://eol.zhbit.com/main.jsp'
    result = opener.open('http://eol.zhbit.com/main.jsp')
    #读取该页面的html并存储到homeHtml
    homeHtml = result.read()
    #编写正则表达式匹配需要获得的内容
    pattern = re.compile(r'<a href="javascript:void\(0\)".*?'+
                         'onclick="changecourse\(\'.(.*?)\'\)"'+
                         '.*?\n.*?'+'title="(.*?)">')
    mainList = pattern.findall(homeHtml)
    for m in mainList:
        print m[1].decode('gbk')
        #打开数据库页面的地址
        dataBaseurl = "http://eol.zhbit.com"+m[0]
        result = opener.open(dataBaseurl)
        result = opener.open('http://eol.zhbit.com/common/hw/student/hwtask.jsp')
        #读取课程作业页面的html并存储到dataBaseHtml
        dataBaseHtml = result.read()
        pattern = re.compile(r'<td align="left"><a href="hwtask.view.jsp.*?class="infolist">(.*?)</a></td>')
        hw = pattern.findall(dataBaseHtml)
        pattern2 = re.compile(r'<td>(.*?)年(.*?)月(.*?)日</td>')
        ti = pattern2.findall(dataBaseHtml)
        t = 0
        for h in hw:
            print(h.decode('gbk') +
                  ' 截止日期'.decode('gbk') + ti[t][0].decode('gbk') +
                  '年'.decode('gbk') + ti[t][1].decode('gbk') +
                  '月'.decode('gbk') +ti[t][2].decode('gbk') +
                  '日'.decode('gbk'))
            t += 1
        print "\n"
        
else:
    print "登陆错误"


运行结果

数据库应用技术 [02102100]
2014-2015-2上机实验7-宏 截止日期2015年7月7日
2014-2015-2上机实验6-报表 截止日期2015年6月22日
2014-2015-2上机实验5 截止日期2015年6月6日
期末考试相关资料上传 截止日期2015年7月6日
2014-2015-2上机实验4 截止日期2015年5月18日
2014-2015-2上机实验3 截止日期2015年5月11日
2014-2015-2上机实验2 截止日期2015年5月4日
2014-2015-2上机实验1 截止日期2015年4月30日


面向对象程序设计(C++) [02120011]
实验课点名7 截止日期2015年7月3日
实验报告8 截止日期2015年7月10日
实验报告7 截止日期2015年7月5日
实验报告6 截止日期2015年6月23日
实验课点名6 截止日期2015年6月5日
实验报告5 截止日期2015年6月12日
实验课点名5 截止日期2015年5月22日
实验报告4 截止日期2015年5月21日
实验课点名4 截止日期2015年5月8日
实验课点名3 截止日期2015年4月24日
实验报告3 截止日期2015年5月5日
实验课点名2 截止日期2015年4月10日
实验报告2 截止日期2015年4月21日
实验课点名1 截止日期2015年3月27日
实验报告1 截止日期2015年3月31日


模拟电子技术 [02120021]
实验6 截止日期2015年7月12日
实验5 截止日期2015年7月12日
项目实例实验 截止日期2015年7月12日
实验三 截止日期2015年7月12日
实验二 截止日期2015年7月12日
实验一 截止日期2015年7月12日


你可能感兴趣的:(爬虫模拟登陆校园网并抓取作业)