python 爬虫登陆学校教务系统之HTML解析

原创 2016年05月31日 20:25:54

    利用python对HTML进行解析是比较方便的。我是利用的BeautifulSoup+正则表达式,正则表达式在处理字符串的时候非常强大,但是逻辑比较难。

  

<link href="/css/newcss/project.css" rel="stylesheet" type="text/css">

<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" style="overflow:auto;">



	

    

        

    	<a name="2013-2014学年秋(两学期)" /></a>

<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">

<tr><td class="Linetop"></td>

</tr>

</table>

<table width="100%"  border="0" cellpadding="0" cellspacing="0" class="title" id="tblHead">

<tr>

					<td width="80%" >

					<table border="0" align="left" cellpadding="0" cellspacing="0" >

					

					<tr>

					<td> </td>

					<td valign="middle"> <b>2013-2014学年秋(两学期)</b>

					 </td>

					</tr>

					</table>

					</td>

					<td width="20%" >					

						<table border="0" align="left" cellpadding="0" cellspacing="0" width="100%" >

						

						<tr>

						<td> </td>						

					<td width="5"></td>

					</tr>

					</table>

					</td>

					</tr>

</table>

<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0"  >

 <tr>

  <td class="Linetop"></td>

 </tr>

</table>

	<table width="100%" border="0" cellpadding="0" cellspacing="0" class="titleTop2">

					 <tr>

					  <td class="pageAlign">

					   <table cellpadding="0" width="100%" class="displayTag" cellspacing="1" border="0" id="user">

					    <thead>

							<tr>

							

             

       		<th align="center" width="10%" class="sortable">

                    课程号

           	</th>

           

       		<th align="center" width="10%" class="sortable">

                    课序号

           	</th>

           

       		<th align="center" width="10%" class="sortable">

                    课程名

           	</th>

           

       		<th align="center" width="10%" class="sortable">

                    英文课程名

           	</th>

           

       		<th align="center" width="10%" class="sortable">

                    学分

           	</th>

           

       		<th align="center" width="10%" class="sortable">

                    课程属性

           	</th>

           

       		<th align="center" width="10%" class="sortable">

                    成绩

           	</th>

           

	</tr>

	</thead>

          

        <tr class="odd" onMouseOut="this.className='even';" onMouseOver="this.className='evenfocus';">

			<td align="center">

                GE1102

            </td>

            <td align="center">

            	 02

            </td>

            <td align="center">

                 高等数学(上)

            </td>

            <td align="center">

                 Calculus I

            </td>

            <td align="center">

                 4

            </td>

            <td align="center">

                 通必

            </td>

            <td align="center">

            

              		<p align="center">90.0 </P>

             </td>

        </tr>

        

        <tr class="odd" onMouseOut="this.className='even';" onMouseOver="this.className='evenfocus';">

			<td align="center">

                GE1104

            </td>

            <td align="center">

            	 01

            </td>

            <td align="center">

                 大学物理(上)

            </td>

上图是原始的获得的HTML文档的一部分,可以看出开发者使用的多么老的写法啊,而且还那么多空格和换行,伤脑筋。

BeautifulSoup 是非常强大的解析工具,可以解析HTML,XML,json等。文档竟然有中文的,看来中国的开发者还是受到了认可的,详情见BeautifulSoup.

sid = xxxxxxxx

marx = Login(str(sid))
while True:
    imagePath = marx.get_code()
    image = marx.imagefilter(imagePath)
    marx.image_to_string(image)
    time.sleep(0.5)
    imageString = marx.getString()
    print imageString
    time.sleep(0.5)
    marx.mProcess.terminate()
    resp_login = marx.login(str(sid),str(sid),imageString)
    if resp_login.status_code == 200:
        break
resp_info = marx.get_info()
soup = BeautifulSoup(resp_info.text)
semester = soup.find_all('b')
semesterList = [i.string for i in semester]
semesterListLength = len(semesterList)
count = 0
if semesterListLength:    
    
    f = open(str(sid)+'info.txt','w')
    first = soup.find("table",attrs ={'border':"0",'cellpadding':"0",'cellspacing':"1",'class':"displayTag", 'id':"user", 'width':"100%"})
    info = marx.infoRe(first.text)
    f.write(str(sid)+'\n\n')
    f.write('\n'+semesterList[count].encode('utf8')+'\n')
    infoLength = len(info)
    for i in range(infoLength-1):
        if i%7==0:
            f.write('\n')
        else:
            f.write(info[i].encode('utf8')+'\t\t\t\t\t')
    f.close()

while semesterListLength-1:
    count+=1
    f = open(str(sid)+'info.txt','a')
    first = first.find_next("table",attrs ={'border':"0",'cellpadding':"0",'cellspacing':"1",'class':"displayTag", 'id':"user", 'width':"100%"})
    info = marx.infoRe(first.text)
    infoLength = len(info)
    f.write('\n\n'+semesterList[count].encode('utf8')+'\n\n')
    for i in range(infoLength-1):
        if i%7==0:
            f.write('\n')
        else:
            f.write(info[i].encode('utf8')+'\t\t\t\t\t')
    semesterListLength = semesterListLength - 1
    
f.close()

首先,根据HTML特征,进行了一个时间的提取,即

<b>2013-2014学年秋(两学期)</b>
然后,提取含有数据的table,提取出来的table,用正则表达式处理一下,拿到数据,并保存到文件中。

遇到的问题,编码格式,因为有中文,所以要用utf8编码,而python默认ascii编码,因此要显示的修改。

二是保存的时候,数据长度不一,造成显示的效果不是很好,这方面要加以改进。


版权声明:本文为博主原创文章,未经博主允许不得转载。

小叙一下在模拟登录学校教务网的经历

之前听说用python会容易些,但自己还没学那么多,没那么熟悉,想着自己的java应该还行,便从网上搜集各种资料。 一开始我也是走了不少弯路的。因为我对网站这些运行细节知之甚少,便想着找个能模拟点击...
  • u013379553
  • u013379553
  • 2018年01月29日 23:43
  • 14

高校教务管理系统源代码.rar

  • 2010年05月14日 16:37
  • 1.43MB
  • 下载

python 爬虫登陆学校教务系统

好像很多人写爬虫,都是从登陆学校教务系统开始的。为什么?学校教务系统渣啊,都是明文传输的,而且是200x年写的,没有用到很多现在的技术,所以相对来说容易些。感觉很多学校都是用的清元优软的这个,我们学校...
  • MarxWolf
  • MarxWolf
  • 2016年05月25日 10:17
  • 1529

python 爬虫实战--登陆学校教务系统获取成绩信息

1. 前言之前写的爬虫都是不需要使用cookie的, 这次我们瞄上了学校的教务系统, 每次登陆都那么几个步骤好费劲啊, 写个爬虫直接获取成绩多好啊~~2. 项目分析首先, 我们的目标页面是: http...
  • zhyh1435589631
  • zhyh1435589631
  • 2016年05月03日 21:28
  • 8671

完美学校网站系统全站源代码学校网站模板下载

  • 2011年01月10日 12:23
  • 1.3MB
  • 下载

校园助手APP--爬取教务处网页,并解析出数据

在使用服务器前,我是直接
  • brian512
  • brian512
  • 2014年11月13日 15:19
  • 20950

[python爬虫]爬取学校教务处以及登录过程验证码的处理

其实是半年前做的一段小代码,爬取自己的学校教务处网站大概是每个学习爬虫的同学的入门必备吧(心疼一秒教务处)。其实想起来本科的时候有大神做了南理工GPA的网页,其实也就是个爬虫然后做了数据处理(只是我的...
  • sinat_31360161
  • sinat_31360161
  • 2016年05月15日 11:22
  • 6711

python小爬虫—获取学校教务处成绩

开始想自己计算一下绩点,所以第一个小爬虫就从抓取自己成绩开始1.工具: chrome浏览器 vscode 2.先来分析一下学校教务处成绩管理系统的结构,用的竟然是frame标签!!首先是一个输入...
  • strugglm
  • strugglm
  • 2017年08月09日 21:23
  • 467

php模拟登陆校园教务网络管理系统

写在前面:使用了python进行爬虫之后,发现还没用过我的老本行php进行爬取过,加上大四狗刚开学就遇到坑*的所谓的实训,又不能出去找实习,于是只能自娱自乐,刚好看到最近学校经营的公众号,有绑定学号,...
  • seven_2016
  • seven_2016
  • 2016年08月31日 20:13
  • 2733

python 爬虫登陆学校教务系统之验证码识别

在网上看了下,验证码识别的内容,发现基本有两种思路,一是利用ocr,这方面有google的开源库tesseract-ocr,另一种是利用机器学习,抓取大量图片,经过处理,得到单个字符的training...
  • MarxWolf
  • MarxWolf
  • 2016年05月25日 10:31
  • 2294
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python 爬虫登陆学校教务系统之HTML解析
举报原因:
原因补充:

(最多只允许输入30个字)