2017-07-27 59 views
0

我试图在Perl中使用LWP :: Simple从联合国网站(安理会决议等)下载一些PDF文档。然而,我没有返回PDF,而是收到一个HTML错误页面。考虑这个非常简单的例子:无法使用Perl和LWP下载PDF

use LWP::Simple; 
use strict; 

my $url = 'https://documents-dds-ny.un.org/doc/UNDOC/GEN/N16/100/02/PDF/N1610002.pdf'; 
my $file = 'test.pdf'; 
getstore($url, $file); 

如果我再看看“检验.pdf”的内容,我觉得他们是一个HTML页面。

我也试过一些LWP :: UserAgent技巧,甚至用cURL,但没有成功。有任何想法吗?

+0

如果您试图直接使用浏览器访问此链接,您也会收到错误消息。因此,有一些身份验证,cookie,引用或链接所需的任何内容。 –

+0

浏览器有点碰巧和缺失:大多数时候,当我将路径粘贴到浏览器中时,PDF加载正确。有时它会给出HTML错误页面,但在大多数情况下不会。 – spatiallyConfused

+0

“*大多数时候,当我粘贴到浏览器的路径,PDF加载正确*”,然后,大部分时间,你以前访问过的主要网站。下载网站预计由主站点设置Cookie。 – ikegami

回答

1

好的,感谢@SteffenUllrich和@ ikegami让我走上正轨!

这确实是一个cookie问题。修复?打开cookie jar,首先访问网站的主页,然后在cookie存储在jar中后访问PDF。

这可以在不使用HTTP :: Cookies的情况下完成。但是,我们需要使用LWP :: UserAgent而不是LWP :: Simple。

低于最低工作例如:

use strict; 
use warnings 'all'; 

use LWP::UserAgent; 

my $homeUrl  = "https://documents.un.org/prod/ods.nsf/home.xsp"; 
my $pdfUrl  = "https://documents-dds-ny.un.org/doc/UNDOC/GEN/N16/100/02/PDF/N1610002.pdf"; 
my $pdfOutputName = "test.pdf"; 

my $browser = LWP::UserAgent->new(cookie_jar => { }); 

my $resp; 

$resp = $browser->get($homeUrl); 
die $resp->status_line unless $resp->is_success; 

$resp = $browser->get($pdfUrl, ':content_file' => $pdfOutputName); 
die $resp->status_line unless $resp->is_success; 

这将产生一个完整的PDF文件。

+0

没有必要存储主页;只需要'$ browser-> get($ homeUrl)'就可以。 '$ homeContents'等是'HTTP :: Response'对象,而不是“contents”,你真的应该测试它们是否成功:'my $ res = $ browser-> get($ url); die $ res-> status_line除非$ res-> is_success;' – Borodin

+0

所有优点,@Borodin。代码相应调整! – spatiallyConfused

+0

你误解了我的意思。我修改了你的代码来演示。 – Borodin