通常のブラウザ(Chrome)を使用してWebサイトAを閲覧しているときに、WebサイトAのリンクをクリックすると、Chrome CSVファイル形式でレポートをすぐにダウンロードします。
サーバーの応答ヘッダーを確認すると、次の結果が得られます。
Cache-Control:private,max-age=31536000
Connection:Keep-Alive
Content-Disposition:attachment; filename="report.csv"
Content-Encoding:gzip
Content-Language:de-DE
Content-Type:text/csv; charset=UTF-8
Date:Wed, 22 Jul 2015 12:44:30 GMT
Expires:Thu, 21 Jul 2016 12:44:30 GMT
Keep-Alive:timeout=15, max=75
Pragma:cache
Server:Apache
Transfer-Encoding:chunked
Vary:Accept-Encoding
次に、PhantomJSを使用してこのファイルをダウンロードして解析します。 page
onResourceReceived
リスナーを設定して、Phantomがファイルを受信/ダウンロードするかどうかを確認します。
clientRequests.phantomPage.onResourceReceived = function(response) {
console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + JSON.stringify(response));
};
ファイル(これはpage.open( 'URL OF THE FILE')です)をダウンロードするためにPhantomリクエストを行うと、Phantomログでファイルがダウンロードされていることがわかります。ログは次のとおりです。
"contentType": "text/csv; charset=UTF-8",
"headers": {
"name": "Date",
"value": "Wed, 22 Jul 2015 12:57:41 GMT"
},
"name": "Content-Disposition",
"value": "attachment; filename=\"report.csv\"",
"status":200,"statusText":"OK"
ファイルとそのコンテンツを受け取りましたが、ファイルデータにアクセスする方法は?現在のPhantomJS page
オブジェクトを印刷するとき、ページAのHTMLを取得しますが、それは望ましくありません。JavaScriptを使用して解析する必要があるCSVファイルが必要です。
数日にわたる調査の後、いくつかの解決策があると言わざるを得ません。
PhanotmJSを使用してファイルをダウンロードする必要がある場合、PhantomJSから離れてCasperJSを使用します。 CasperJSはPhantomJSに基づいていますが、はるかに優れた直感的な構文とプログラムフローを備えています。
「 なぜCasperJSがPhantomJSよりも優れているのか 」を説明する良い投稿です。この投稿では、ファイルのダウンロードに関するセクションを見つけることができます。
CasperJSを使用してCSVファイルをダウンロードする方法(サーバーがヘッダーContent-Disposition:attachment; filename='file.csv
を送信する場合でも機能します)
ここでは、ダウンロード可能なカスタムcsvファイルを見つけることができます。 http://captaincoffee.com.au/dump/items.csv
CasperJSを使用してこのファイルをダウンロードするには、次のコードを実行します。
var casper = require('casper').create();
casper.start("http://captaincoffee.com.au/dump/", function() {
this.echo(this.getTitle())
});
casper.then(function(){
var url = 'http://captaincoffee.com.au/dump/csv.csv';
require('utils').dump(this.base64encode(url, 'get'));
});
casper.run();
上記のコードはhttp://captaincoffee.com.au/dump/csv.csv
CSVファイルをダウンロードし、結果をbase64文字列として出力します。このように、データをファイルにダウンロードする必要さえなく、データはbase64文字列として保持されます。
ファイルシステムにファイルを明示的にダウンロードする場合は、CasperJSで使用可能なdownload
関数を使用できます。
PhantomJSのソリューションを見つけました。これを読む discussion 私は jsfiddle を見つけました。これはjQueryのajaxメソッドを介してURLをダウンロードし、base64としてファイルをエンコードします。
ダウンロードしたいファイルはプレーンテキスト(CSV)であったため、エンコード機能を削除しました。ターゲットページには既にjQueryが含まれているため、 jQueryをターゲットページに挿入する にする必要はありませんでした。
私のコードでは、PhantomJSを使用してファイルをダウンロードするページを既に開いており、そのページにはjQueryが含まれていると想定しています。私の場合、ダウンロードリンクを取得するには、まずサイトにログインする必要がありました。
var fs = require('fs');
var page=this;
var result = page.evaluate(function() {
var out;
$.ajax({
'async' : false,
'url' : 'fullurltodownload.csv',
'success' : function(data, status, xhr) {
out = data;
}
});
return out;
});
fs.write('mydownloadedfile.csv', result);
前の2つの答えは、最終的なCSVファイルのURLを事前に知っていることを前提としています。 Javascriptで計算されたファイルへのリダイレクトを行うHTMLページへのリンクがあり、PhantomJSの外部でそのJavascriptを評価したくない場合、これは当てはまりません。オプションは次のとおりです。
text/plain
_に変更し、_Content-Disposition
_ヘッダーを削除するアップストリームプロキシの背後にPhantomJSを配置します。これにより、通常の方法でPhantomJSからファイルを読み取ることができます。 tは、0バイトのバイナリで動作します。これらの最初のオプション(PhantomJS +アップストリームプロキシ)は、PhantomJSがリモートサイトに送信するAccept
ヘッダーをアップストリームプロキシが監視できる場合に簡単になります。少なくともPhantomJSバージョン2.1.1では、メインリクエストには_Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
_があり、スタイルシートリクエストには_Accept: text/css,*/*;q=0.1
_があり、他のすべてのリクエスト(画像、スクリプト、XMLHttpRequest)はデフォルトで_Accept: */*
_になりますが、これはオーバーライドできますXMLHttpRequest.setRequestHeader()
を使用するサイトによって。したがって、アップストリームプロキシが_text/html
_を含むAccept
ヘッダーを持つリクエストを見つけ、thisリクエストをサーバーに渡す場合CSVファイルまたはその他のHTML以外のドキュメントが作成された場合、これが保存される可能性が高くなります。