2017-07-27 42 views
0

私は、国連のWebサイト(セキュリティ評議会の決議など)から多数のPDF文書をダウンロードするために、LWP :: SimpleをPerlで使用しようとしています。 PDFを返すのではなく、HTMLエラーページを受け取っています。この非常に簡単な例を考えてみましょう:私はその後、「test.pdfという」の内容を見れば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); 

、私は彼らがHTMLページであることを見つけます。

私はLWP :: UserAgentで数多くのトリックを試していますが、cURLでも成功していません。何か案は?

+0

ブラウザでこのリンクに直接アクセスしようとすると、エラーメッセージが表示されます。したがって、認証、クッキー、リファラー、またはリンクに追加で必要なものがあります。 –

+0

ブラウザで少しヒットしてしまいます。ブラウザにパスをペーストすると、PDFが正しく読み込まれます。 HTMLエラーページが表示されることもありますが、ほとんどの場合そうではありません。 – spatiallyConfused

+0

"*ブラウザにパスを貼り付けたときの大部分は、PDFが正しく読み込まれます*"、その後、大部分の時間は以前はメインサイトを最初に訪問していました。ダウンロードサイトでは、メインサイトによって設定されたクッキーが必要です。 – ikegami

答えて

1

@SteffenUllrichと@ ikegamiのおかげで、私は正しい軌道に乗ることができました!

これは確かにクッキーの問題です。修正?クッキージャーを開き、サイトのホームページにアクセスしてから、クッキーがジャーに保管されたらPDFにアクセスしてください。

これはHTTP :: Cookiesを使用せずに行うことができます。しかし、LWP :: Simpleの代わりにLWP :: UserAgentを使う必要があります。

以下の最小作業例:

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'などは' contents :: 'ではなく 'HTTP :: Response'オブジェクトであり、本当に成功のためにそれらをテストする必要があります:' $ $ res = $ browser-> get($ url); $ res-> is_success;がなければ$ res-> status_lineで死ぬ; – Borodin

+0

良い点、@Bododin。コードはそれに応じて調整! – spatiallyConfused

+0

あなたは私の意味を誤解しました。デモするためにコードを修正しました。 – Borodin

関連する問題