无法使用Perl和LWP下载PDF
我试图在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,但没有成功。有任何想法吗?
好的,感谢@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文件。
没有必要存储主页;只需要'$ browser-> get($ homeUrl)'就可以。 '$ homeContents'等是'HTTP :: Response'对象,而不是“contents”,你真的应该测试它们是否成功:'my $ res = $ browser-> get($ url); die $ res-> status_line除非$ res-> is_success;' – Borodin
所有优点,@Borodin。代码相应调整! – spatiallyConfused
你误解了我的意思。我修改了你的代码来演示。 – Borodin
如果您试图直接使用浏览器访问此链接,您也会收到错误消息。因此,有一些身份验证,cookie,引用或链接所需的任何内容。 –
浏览器有点碰巧和缺失:大多数时候,当我将路径粘贴到浏览器中时,PDF加载正确。有时它会给出HTML错误页面,但在大多数情况下不会。 – spatiallyConfused
“*大多数时候,当我粘贴到浏览器的路径,PDF加载正确*”,然后,大部分时间,你以前访问过的主要网站。下载网站预计由主站点设置Cookie。 – ikegami