|
|
不需要用 Perl 或者更高深的技术,通过 Linux 下面的 Shell Script 写的小程序就可以通过访问 RSS 及相关 Web 页面,把所有内容生成为本站 Wiki 的格式。以下是联合早报 RSS 的下载程序:
首先是调试用的参数,并且来到此脚本所在的目录。
fetch=true testing=false dir=`dirname $0` cd "$dir"
然后是联合早报的 RSS 类别及 URL。
cat[0]=中国新闻
cat[1]=国际新闻
cat[2]=东南亚新闻
cat[3]=新加坡新闻
cat[4]=今日观点
cat[5]=中国财经
cat[6]=狮城财经
cat[7]=全球财经
cat[8]=早报体育
cat[9]=早报副刊
cat[10]=世界报刊文萃
xmls='http://www.zaobao.com/zg/zg.xml
http://www.zaobao.com/gj/gj.xml
http://www.zaobao.com/yx/yx.xml
http://www.zaobao.com/sp/sp.xml
http://www.zaobao.com/yl/yl.xml
http://www.zaobao.com/cz/cz.xml
http://www.zaobao.com/cs/cs.xml
http://www.zaobao.com/cg/cg.xml
http://www.zaobao.com/ty/ty.xml
http://www.zaobao.com/fk/fk.xml
http://www.zaobao.com/special/newspapers/wencui.xml'
接下来是处理文本的工具,基本上用 sed 和 awk 通通搞定。
clean0='sed -e s/<[^>]*>//g'
clean1='sed -e s/^[[:blank:]]*// -e s/^\( \)*// -e s/—/-/g'
tail2='awk {if(length($0)>0){n++};if(n>2){print($0)}}'
tail1='awk (!n){if(length($0)){n=1};next}(n==1){if(!length($0)){n=2};next}{print($0)}'
text='awk --re-interval \
BEGIN{m=0}/_{20,}/{m=m+1;next}/ad_A_bottom.html/{exit}//{if(m==2){print($0)}}'
然后开始生成中文日期,和文件头。最终的文件名为 zaobao-<日期>.awki,是个纯文本文件。
date=`LC_ALL=zh_CN.GBK date +%x` file="zaobao-`date +%F`" txt="$file.awki" cat > $txt <<END 联合早报 $date <index> END
这里才进入主要工作,对每个专栏抓取 RSS,然后抓取其中指向的 Web HTML 页面。
idx=0
for xml in $xmls
do
$fetch && wget -O $idx.xml "$xml"
section=${cat[$idx]}
echo -e "-${section}\n" >> $txt
urls=`grep '<link>' $idx.xml|$tail2|$clean0`
i=0
for url in $urls
do
对于每个 HTML 页面,使用 lynx 来直接生成纯文本格式。
$fetch && lynx -verbose -display_charset=GB2312 -dump "$url" > $idx-$i.html
urll=`echo $url|sed -e 's/.html//g'`
pages=`grep $urll $idx-$i.html|sed -e 's/^[^h]*//'|sort|uniq`
因为单个 HTML 页面可能内容实行了分页,继续抓取剩余页面。
cat $idx-$i.html|$text|grep -v IFRAME|grep -v \]下一页 > $idx-$i.txt
for page in $pages
do
$fetch && lynx -verbose -display_charset=GB2312 -dump $page|$text|\
awk 'BEGIN{m=0}/IFRAME/{m=m+1;next}//{if(m==1){print($0)}}'|\
grep -v \]上一页 >> $idx-$i.txt
done
take="awk BEGIN{n=0}//{if(n==$i){print(\$0)};n=n+1}"
然后获取文章标题,并入到最终 awki 文档当中。
sub=`grep '<title>' $idx.xml|$tail2|$take|$clean0|$clean1`
echo -e "--${sub}\n" >> $txt
cat $idx-$i.txt|$tail1|$clean0|$clean1|sed -e 's/^-/ -/g' >> $txt
i=$(($i + 1))
done
idx=$(($idx + 1))
done
任务完成,最后清理一下整个过程中生成的中间文档。
$testing || rm *.txt *.html *.xml