无法使用 Perl 和 LWP 下载 PDF
Unable to download PDFs with Perl and LWP
我正在尝试使用 Perl 中的 LWP::Simple 从联合国网站(安理会决议等)下载一些 PDF 文档。然而,我没有返回 PDF,而是收到 HTML 错误页面。考虑这个非常简单的例子:
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);
如果我再查看 "test.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 文件。
我正在尝试使用 Perl 中的 LWP::Simple 从联合国网站(安理会决议等)下载一些 PDF 文档。然而,我没有返回 PDF,而是收到 HTML 错误页面。考虑这个非常简单的例子:
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);
如果我再查看 "test.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 文件。