对抓取网页的脚本http://life2death.blog.51cto.com/7550586/1657133 的研究:

声明:本人只是拿来学习研究,谢谢浮夸往事大神。


一道企业shell编程实战题 http://oldboy.blog.51cto.com/2561410/1657042

本脚本对http://edu.51cto.com/的视频具有通用性,暂未发现bug,如有发现,请看官自行解决。

---------------------------------------------------------------------------------

#!/bin/bash
# oldboy linux training
# 2015-06-01
# Happy Children's Day
# 说明:本脚本来自老男孩linux21期学员张耀开发!
EduFile=/tmp/edu.html     ##定义文件来存放网页的HTML源码
EduFile2=/tmp/edu2.html   
Url="$*"  ##网址参数
 
# Judge url is ok?
curl -I $Url &>/dev/null     ##对网址进行一个测试,看网址是否能连通
[ $? -ne 0 ] &&{
   echo "Bad url,Please check it"  
   exit 1       ##如果不能连上的话,直接中断退出,不再执行后面的步骤
}
 
# Defined get pagenum and CourseId Functions
function getnum(){      ##这个函数主要用于抽取网址页面的视频的总页数
        curl -s $Url>$EduFile
        grep '"pagesGoEnd"' $EduFile &>/dev/null  ##用于检测这个视频是否已经完结

##51cto中完结了的视频和正在更新的视频html代码如下图:

已完成的视频,会标有pagesGoEnd:

对抓取网页的脚本的研究_linux

正在更新的视频,最后一页的页码带有“#”:

对抓取网页的脚本的研究_linux_02

if [ $? -eq 0 ]  ##如果视频是已经更新玩的话,进行下面的抽取页码。 
          then
            num=`sed -rn 's#.*page=([0-9].*)" class="pagesGoEnd".*$#\1#gp' $EduFile`

####

sed: 

-r 表支持延伸式的正则表达式,-n 表静默输出。 

s///gp :s表替换,g表全局,p打印出被匹配到的行(与n连用)

\1 :表示引用第一个括号里的内容;page=([0-9].*) 引用这里的括号里的内容,从而打印出数字,也就是视频的页数。


       

else   ##表示视频还处于跟新的状态,进行下面的取页数
            num=`sed -rn 's|.*page=([0-9].*)#" class="pagesNum".*$|\1|gp' $EduFile`
        fi
        pagenum=${num:-1} ##表如果num不存在或为空的时候,则取后面的值,即1,而":-"是固定符号
        CourseId=`echo $Url|awk -F "[-.]" '{print $4}'` ##取课程号,
}

 

 ###抽取的页数如下图:对抓取网页的脚本的研究_linux_03

课程编号如:

对抓取网页的脚本的研究_linux_04

# Defined curl html Functions
function Curl(){   ##将每页的课程代码存放到/tmp/edu.html中
        getnum
        for i in `seq $pagenum`
          do 
        curl "http://edu.51cto.com/index.php?do=course&m=lessions&course_id=$CourseId&page=$i" 1>>$EduFile 2>/dev/null
        done

}

###http://edu.51cto.com/index.php?do=course&m=lessions&course_id=839&page=1 

这个链接打开的页面如下:(这样就达到一页一页的打开视频页)

对抓取网页的脚本的研究_linux_05

# Defined Create table Functions
function table(){
        sum=""
        index=1
        sed -rn '/do=lesson/ s#<.*(<a href=")(.*)</h4>$#\1http://edu.51cto.com\2#gp' $EduFile > $EduFile2 ##抽取每个视频的网址和其对应的标题

抽取的部分如下:

对抓取网页的脚本的研究_linux_06

       

while read line
          do
            sum=$sum"<tr><th width="40" scope="row">$index</th><td width="520">$line</td>"
            ((index++)) ##统计有多少个视频
        done <$EduFile2  ##对抽取的网址和标题进行重新的编排。
}

编排效果如下:

对抓取网页的脚本的研究_linux_07

 

# Defined Create html Functions
function html(){
        cat >/tmp/oldboy.html<<-END
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>test</title>
        </head>
         
        <body>
        <table width="560" border="1">
        $sum    ##将表格嵌入到网页中
        </table>
        </body>
        </html>
        END
}
 
function main(){
        Curl
        table
        html
}
main