Website RSS : script
选择格式(自定义):

上次修改于:Sun, 11 Nov 2007 22:14:41 -0800

Web RSS 下载技术

不需要用 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


留言板我要留言