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

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

235116_2w3P_1177799.gif


找到相应的表单代码

235220_6T4z_1177799.gif

用户名的name是IPT_LOGINUSERNAME

密码的name是IPT_LOGINPASSWORD

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

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

235641_hmuG_1177799.png 


提交成功后页面变成这样

000017_Gpij_1177799.png

点击进入

000017_wV1X_1177799.png

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

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


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

每个学科都有相应的链接

同样我们找相应的代码

000658_CGAW_1177799.png


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

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


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

232428_1oBG_1177799.png


找到课程作业的链接

232617_XtEX_1177799.png

#打开课程作业页面的地址
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日


转载于:https://my.oschina.net/u/1177799/blog/491645

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值