[解決済み] PhantomJSを使用してcsvファイルをダウンロードする方法
質問
通常のブラウザ(Chrome)でAというウェブサイトを見ていて、Aというウェブサイト上のリンクをクリックすると、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));
};
Phantomでファイルのダウンロードを要求すると(これはpage.open('URL OF THE FILE'))、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
私はCSVファイルが欲しいのですが、JavaScriptを使ってパースする必要があります。
どのように解決するのですか?
何日も何日も調査した結果、いくつかの解決策があると言わざるを得ません。
- 評価関数でAJAXを呼び出し、ファイルをダウンロードしてエンコードし、このコンテンツをファントム・スクリプトに戻すことができます。
- GitHubで公開されているカスタムPhantomライブラリを使用することもできます。
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文字列として取得できます。
明示的にファイルをファイルシステムにダウンロードしたい場合は
download
という関数があります。
関連
-
[解決済み】Vueのテンプレートまたはレンダー関数が定義されていない 私はどちらも使っていないのですが?
-
[解決済み】 Uncaught Reference Error: stLight is not defined (in Chrome only)
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] jQueryで、ユーザーがそのフィールドを編集している間、テキストフィールドの最初の文字を大文字にするにはどうすればよいですか?
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】「Uncaught TypeError: Chromeで "Illegal invocation "が発生する。
-
[解決済み】SyntaxError: ChromeのJavascriptコンソールでUnexpected Identifierが発生する。
-
[解決済み】npm install --legacy-peer-deps は具体的に何をするのですか?どんなときに推奨されるのか/どんな使用例が考えられるのか?
-
[解決済み】Redux TypeError: 未定義のプロパティ 'apply' を読み取れない
-
[解決済み】ES6マップオブジェクトをソートすることは可能ですか?
-
[解決済み】ETIMEDOUTエラーの対処方法は?
-
[解決済み】中央値の計算 - javascript