免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2016 | 回复: 1
打印 上一主题 下一主题

一段下载资料的脚本,请大家提些建议。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-05 15:28 |只看该作者 |倒序浏览
很多时候,我们需要的文档和资料以网页的形式存在,为了方便我们需要将其下载到本机上,一般来说 ,内容稍丰富的文档资料会由多个网页组成,比如apache 服务器的文档由多达200多个页面组成,我们当然可以用离线浏览器之类的 软件下载,除此以外,自己写脚本也不错,下面就是本人写的一段脚本,脚本使用举例,下载apache文档,down.pl http://man.chinaunix.net/newsoft ... N_2.2new/index.html(假设脚本取名为down.pl),目前存在的问题是 如果网页中存在和index.html所在目录平级或者更高的目录中的文件,就没法下载了,请大家给个建议。

#!/usr/bin/perl

#script for download html page.

#Author Huang Yong.

#2007-9-1


use File::Basename;
use File::Spec;

sub downloadpage{
    my $main_path = dirname($_[0]);
    getpage($_[0],$main_path);
    
}

sub catfile{
    $dirname = $_[0];
    $filename = $_[1];

    if($filename =~ m@^\./(.+)@){
       $filename = $1;

    }

    while($filename =~ m@^\.\./(.+)@){
        $dirname = dirname($dirname);
    $filename = $1;
    }
    my $re = File::Spec->catfile($dirname,$filename);
    $re =~ s@http:/@http://@;
    return $re;
}

sub getpage{
    my $filename;
    my $str=$_[1];
    my $pageurl = $_[0];
    my $main_path=$_[1];
    $str=~s/\./\\./g;
    my $pattern = "$str/(.+)";
    $str=$pageurl;
    if($str=~m@$pattern@){
        $filename = $1;
    }
    my $dirname = dirname($filename);
    
    unless (-d $dirname) {mkdir $dirname};
    
    if (-e $filename){
        return;
    }
    print "Page $pageurl is download now...\n";     
    `wget $pageurl -P $dirname`;
    
    my $remote_path = dirname($pageurl);

    if($filename =~ /htm[l]?$/){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open fp, "< $filename" or die "Can not open file $filename";
&nbsp;&nbsp;&nbsp;&nbsp;my @file = <fp>;
&nbsp;&nbsp;&nbsp;&nbsp;close fp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $line;
&nbsp;&nbsp;&nbsp;&nbsp;foreach $line(@file){
&nbsp;&nbsp;&nbsp;&nbsp;    while($line =~ m@href\s*=\s*"([^"]+)"(.*$)@){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $link_url = $1;               #超链接
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$line = $2;                      # 匹配剩余部分继续匹配
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$link_url =~ s@([^#]+)#.+$@$1@;  #去除锚点描述

&nbsp;&nbsp;&nbsp;&nbsp;        unless ($link_url !~ m@http://@) {next;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unless ($link_url !~ m@mailto@) {next;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unless ($link_url !~ m@^#@) {next;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$pageurl = catfile($remote_path,$link_url);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getpage($pageurl,$main_path);
&nbsp;&nbsp;&nbsp;&nbsp;    }
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}   


foreach(@ARGV){
&nbsp;&nbsp;&nbsp;&nbsp;print "
Page $_ download now,please wait...\n";
&nbsp;&nbsp;&nbsp;&nbsp;downloadpage($_);
}
print "
Page download success!\n


[ 本帖最后由 weiqiboy 于 2007-9-5 15:33 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-09-05 15:29 |只看该作者
  1. #!/usr/bin/perl
  2. #script for download html page.
  3. #Author Huang Yong.
  4. #2007-9-1

  5. use File::Basename;
  6. use File::Spec;

  7. sub downloadpage{
  8.     my $main_path = dirname($_[0]);
  9.     getpage($_[0],$main_path);
  10.    
  11. }

  12. sub catfile{
  13.     $dirname = $_[0];
  14.     $filename = $_[1];

  15.     if($filename =~ m@^\./(.+)@){
  16.        $filename = $1;

  17.     }

  18.     while($filename =~ m@^\.\./(.+)@){
  19.         $dirname = dirname($dirname);
  20.         $filename = $1;
  21.     }
  22.     my $re = File::Spec->catfile($dirname,$filename);
  23.     $re =~ s@http:/@http://@;
  24.     return $re;
  25. }

  26. sub getpage{
  27.     my $filename;
  28.     my $str=$_[1];
  29.     my $pageurl = $_[0];
  30.     my $main_path=$_[1];
  31.     $str=~s/\./\\./g;
  32.     my $pattern = "$str/(.+)";
  33.     $str=$pageurl;
  34.     if($str=~m@$pattern@){
  35.         $filename = $1;
  36.     }
  37.     my $dirname = dirname($filename);
  38.    
  39.     unless (-d $dirname) {mkdir $dirname};
  40.    
  41.     if (-e $filename){
  42.         return;
  43.     }
  44.     print "Page $pageurl is download now...\n";     
  45.     `wget $pageurl -P $dirname`;
  46.    
  47.     my $remote_path = dirname($pageurl);

  48.     if($filename =~ /htm[l]?$/){
  49.         open fp, "< $filename" or die "Can not open file $filename";
  50.         my @file = <fp>;
  51.         close fp;

  52.         my $line;
  53.         foreach $line(@file){
  54.             while($line =~ m@href\s*=\s*"([^"]+)"(.*$)@){
  55.                 my $link_url = $1;               #超链接
  56.                 $line = $2;                      # 匹配剩余部分继续匹配
  57.                 $link_url =~ s@([^#]+)#.+$@$1@;  #去除锚点描述

  58.                 unless ($link_url !~ m@http://@) {next;}
  59.                 unless ($link_url !~ m@mailto@) {next;}
  60.                 unless ($link_url !~ m@^#@) {next;}

  61.                 $pageurl = catfile($remote_path,$link_url);
  62.                 getpage($pageurl,$main_path);
  63.             }
  64.         }
  65.     }
  66. }   


  67. foreach(@ARGV){
  68.     print "Page $_ download now,please wait...\n";
  69.     downloadpage($_);
  70. }
  71. print "Page download success!\n";
复制代码

[ 本帖最后由 weiqiboy 于 2007-9-5 15:35 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP