2017-07-27 83 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