如何使用Perl Script从Web URL下载.zip文件?

时间:2012-03-24 01:26:20

标签: perl url download

我想通过点击“以csv格式下载文件”下载URL http://www.nseindia.com/content/equities/cmbhav.htm上提供的.zip文件。

如果右键单击“以csv格式下载文件”并选择复制链接位置,则URL模式将如下 http://www.nseindia.com/content/historical/EQUITIES/2012/MAR/cm23MAR2012bhav.csv.zip

我想写一个Perl脚本,它将从URL下载.zip文件。

以下代码无效

#!/usr/bin/perl
use warnings;
use strict;
use LWP::Simple;

my $url = 'http://www.nseindia.com/content/historical/EQUITIES/2012/MAR' ;
my $file = 'cm23MAR2012bhav.csv.zip'    ;
getstore($url, $file) ;

2 个答案:

答案 0 :(得分:5)

如果您需要更改用户代理但仍想使用LWP::Simple,则可以使用$ua导出:

use File::Basename;
use LWP::Simple qw($ua getstore);
use URI;

my $url = URI->new( 'http://www.nseindia.com/content/historical/EQUITIES/2012/MAR/cm23MAR2012bhav.csv.zip' );

$ua->default_headers( HTTP::Headers->new(
    Accept => '*/*', 
    )
    );

$ua->agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.54.16 (KHTML, like Gecko) Version/5.1.4 Safari/534.54.16");

my $rc = getstore( $url, basename( $url->path ) );
say "Result is $rc";

事实证明,用户代理字符串和Accept标头的组合将会这样做。通常,这些问题归结为使您的LWP请求看起来就像浏览器发送的请求一样。我使用HTTPScoop来观察浏览器事务,但是有很多程序会为你做同样的事情。

如果事情变得复杂,我赞成Mojo::UserAgent。这个交易更容易玩:

use File::Basename;
use Mojo::UserAgent;
use URI;

my $url = URI->new( 'http://www.nseindia.com/content/historical/EQUITIES/2012/MAR/cm23MAR2012bhav.csv.zip' );
my $file = basename( $url->path );
printf "URL: %s\nFile: %s\n", $url, $file;

my $response = Mojo::UserAgent->new->name(
    '"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.54.16 (KHTML, like Gecko) Version/5.1.4 Safari/534.54.16"'
    )->get( $url->as_string, { Accept => '*/*' } )->res;

open my $fh, '>', $file or die "Could not open [$file]: $!";
print $fh $response->body;
printf "Status: %d\n", $response->code;

答案 1 :(得分:2)

如果您使用

       print getstore($url, $file);

你看到你得到403错误(禁止)。

添加

尝试使用curl,似乎他们检查了用户代理,因此您不能使用LWP :: Simple,因为您必须将用户代理设置为真正的浏览器。

<强> ADD2

以下作品

#! /usr/bin/perl -w

use warnings;
use strict;

use LWP::UserAgent;
my $url = 'http://www.nseindia.com/content/historical/EQUITIES/2012/MAR/cm23MAR2012bhav.csv.zip';
#my $file = 'cm23MAR2012bhav.csv.zip';
#my $url = 'http://localhost:11000';

my $ua = LWP::UserAgent->new;
$ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (FM Scene 4.6.1)");
my $req = HTTP::Request->new(GET => $url);
$req->header(Accept => "*/*");
# $req->remove_header('Connection');  # does not work
# $req->remove_header('TE');          # does not work
my $res = $ua->request($req);
if ($res->is_success)
{
    print $res->content;
}
else
{
    print $res->status_line, "\n";
}

标题TE和连接不会被行remove_header删除,因为它们是在协议级别插入的,因此删除它们是一个不同的过程(我不知道)。

无论如何,这足以让它发挥作用。

编辑我在UserAgent字符串中有一个最终空格,这导致LWP添加libwww-perl,这就是服务器提供403的原因

重要提示

您必须重定向输出,或者更改一些代码以将内容保存到文件中。另请注意,要下载zip,您必须为其提供正确的URL,而不是包含zip链接的页面的URL。