罗明的博客
... ...
讨论Eclipse, Java, Linux, Google产品
              

先讲讲做这个小程序的动机吧,昨天看了下以前学院的新闻,没什么更新,但发现列表很长,保留了2003年1月至今的所有新闻。

这个新闻列表是大学期间我们了解学院信息的主要来源,都养成了每天先看新闻再看BBS的习惯。在大连实习期间更是如此,也算是产生感情了^__^,所以。。。决定把这700+新闻全部保存下来...

需求:指定一个网址,将这个网页和里面所有的子链接页面都下载下来,保存到指定的文件夹中。

如下图所示:
news.jpg


需求有了,怎么完成呢?用迅雷下载全部链接?嗯,这是个好主意,(我确实也这么做了一次,连接数开得太多了,差点被封orz ),但咱们是搞软件的@_@,这个小功能是不是写个程序就能搞定,用Java?想到那一堆Stream的封装(new BufferedReader(new BufferedOutputStream(new FileOutputStream(new File("blabla.html")))))...我就头晕。

小程序用脚本语言?应该不错!

Perl还是Python?。。。经过一番网上查询论证,似乎:Perl语法复杂,但简练,API库也超级多;Python语法清晰易懂,有点像Java,适合开发大型应用。

Java是我的最爱,也算熟悉了,就学点bt的吧,用Perl

完成代码期间主要参考了Perl文档中URL,HTML::LinkExtor,HTTP::Request的用法,Perl中国的一篇文章《LWP与WEB的基本使用》,还占用了J2EE的上课时间来编写程序。。。

 1 #
 2 # Copyright (C) 2007 罗明 <andyluo197(at)gmail.com>
 3 #
 4
 5 use  strict  " vars " # 严格遵循my scope定义
 6
 7 use  LWP :: Simple;
 8 use  HTML :: LinkExtor;
 9 use  HTTP :: Request :: Common;
10 use  LWP :: UserAgent;
11 use  URI :: URL;
12
13 #  从命令行参数中取主网页地址和保存文件夹
14 my   $url   =   $ARGV [ 0 ]; 
15 my   $location   =   $ARGV [ 1 ];
16
17 #  子程序,解析主网页中的链接地址
18 my   @urls   =  ();
19 sub  urlCallback
20 {
21      my ( $tag ,   %attr =   @_ ;
22      return   if   $tag  ne  ' a ' ;
23      push ( @urls ,   values   %attr );
24 }
25
26 #  用于解析链接的LinkExtractor
27 my   $p   =  HTML :: LinkExtor -> new( \& urlCallback);
28
29 #  载入主网页内容,及解析链接地址
30 my   $ua   =  LWP :: UserAgent -> new;
31 my   $res   =   $ua -> request(HTTP :: Request -> new(GET  =>   $url ) ,   sub { $p -> parse( $_ [ 0 ])});
32
33 #  将链接的相对路径转换为绝对路径
34 my   $base   =   $res -> base;
35 @urls   =   map  { $_   =  url( $_ ,   $base ->   abs @urls ;
36
37 #  将网页写入文件
38 $ua -> request(GET( $url ) ,   $location   .   ' \\index.html ' );
39 my   $index   =   1 ;
40 foreach ( @urls )
41 {
42      $ua -> request(GET( $_ ) ,   $location   .   ' \\ '   .   $index   .   ' .html ' );
43      $index += 1 ;
44 }


主网页保存为index.html,子网页按1、2、3排序生成1.html、2.html等

因为有Google Desktop,即使文件名是1.html...,搜索起来也是很方便的。也可以扩充下,将<a></a>中的新闻主题抽出来作为文件名。但这个程序对我来说已经足够了,所以就不继续做了。

总的来说用Perl还是很简单的,库也很多,写起来挺方便!但是要记得常翻翻Perl手册,呵呵

Technorati Tag :  Perl LWP  Download  web  script



版权所有 罗明
posted on 2007-01-03 21:00 罗明 阅读(2319) 评论(15)  编辑  收藏 所属分类: ProgramTechOthersStudyNewsPerl
Comments

只有注册用户登录后才能发表评论。


网站导航: