Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl脚本从web URL下载.zip文件?_Perl_Url_Download - Fatal编程技术网

如何使用Perl脚本从web URL下载.zip文件?

如何使用Perl脚本从web URL下载.zip文件?,perl,url,download,Perl,Url,Download,我想通过点击“下载csv格式的文件”下载一个.zip文件,该文件在URL上可用 如果右键单击“下载csv格式的文件”并选择复制链接位置,则URL模式如下 我想编写一个Perl脚本,从URL下载.zip文件 下面的代码不起作用 #!/usr/bin/perl use warnings; use strict; use LWP::Simple; my $url = 'http://www.nseindia.com/content/historical/EQUITIES/2012/MAR' ; m

我想通过点击“下载csv格式的文件”下载一个.zip文件,该文件在URL上可用

如果右键单击“下载csv格式的文件”并选择复制链接位置,则URL模式如下

我想编写一个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) ;
如果你使用

       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";
}
lines remove_标头不会删除标头TE和Connection,因为它们是在协议级别插入的,所以删除它们是一个不同的过程(我不知道)

无论如何,这足以让它工作

edit我在UserAgent字符串中有最后一个空格,这导致LWP添加了
libwww-perl
,这就是服务器给出403的原因)

重要提示


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

如果您需要更改用户代理并且仍要使用,您可以使用
$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请求看起来与浏览器将发送的请求一样。我过去常常观看浏览器事务,但是有很多程序可以为您做同样的事情

不过,如果事情变得这么复杂,我倾向于。处理事务更容易一些:

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;

您可以更改LWP::Simple使用的用户代理。我一直以最简单的方式使用::Simple,从未检查是否可以自定义以及可以自定义什么!很高兴知道,谢谢。我再一次想知道为什么有人在正确答案上加-1,这也给出了正确的答案。还有一种最简单的方法仍然使用::Simple?不管怎样,答案仍然是正确的并且有效。有时我忘了可能是时间花得太多了——即使只有几分钟。代码中的额外行只是(个人)试图让LWP发送与cURL相同的请求。为什么你会认为时间花费得很糟糕,因为有人否决了你喜欢的答案?提问者仍然会得到你的答案,你想出了一些办法,而且这个办法仍然适用于全世界。所有这些都没有被否决票否决。你只需要增加选票。不,这是一个哲学问题(可以这么说)。这并不完全是关于上/下投票,而是关于人们必须决定上/下/不投票的过程和判断(部分是关于这如何影响知识水平较低、判断答案的“工具”较少的人的判断)。争论的范围很广,而且完全是无稽之谈,我只是有时候喜欢争论!这对我来说非常有效,因为我及时尝试了。如果你不能,你怎么知道它有效??我想知道。。。我已从以下位置获取用户代理字符串。。。如果我像Q/A网站上的许多用户一样愚蠢的话,我会-1这个答案(通常这一个也不例外)。此外,这不会得到zip,而是包含zip链接的页面。OP的错误,我在我的“-1”答案中默默地修正了。虽然OP只需重新定向输出或修改一点代码即可按其要求保存文件,但我如何知道我可以更改用户代理?我经常这样做。我也直接查看了HTTP请求和响应。我不知道你在评论的其余部分想说什么。不,你怎么知道它会解决问题!(我碰巧发现仅仅更改用户代理是不够的)。这是一个关于判断的“逻辑过程”的观点,我经常不明白。我想你错过了我第一个版本中的那部分,我说我不知道它是否解决了问题。当我今天早上尝试时,我可以获取资源,所以我修改了我的答案。但是,我对用户代理的特定更改并不重要。重要的是你可以影响用户代理。是的,我错过了那部分,对不起!