1. ホーム
  2. javascript

[解決済み] PhantomJSを使用してcsvファイルをダウンロードする方法

2022-02-27 03:49:23

質問

通常のブラウザ(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 という関数があります。