WEBサイトスクレイピングをやっていると、画像データやPDFなどの資料系をダウンロードしたくなることがある。
そんな時は、慌てず騒がず、Nodejsの標準ライブラリだけで、簡単に行うことができます。
そして、ダウンロードするデータに任意の名前をつけたり、特定の処理をコールバックさせたい場合に値やfunctionを送る方法も含めて、簡単なライブラリを作っておきました。
データダウンロードするソースコード
/**
* ファイルをダウンロードするライブラリ
*/
var fs = require('fs');
var request = require('request');
module.exports = (function(){
var $$ = function(url , saveFile){
console.log(saveFile);
request({method: 'GET', url: url, encoding: null , saveFile:saveFile} , function (error, response, body){
if(!error && response.statusCode === 200){
fs.writeFileSync(response.request.saveFile , body, 'binary');
}
});
};
return $$;
})();
var download = require('./download');
download("https://www.toyota.co.jp/pages/contents/jpn/investors/financial_results/2019/q1/yousi.pdf","toyota.pdf");
実行プログラムは、トヨタ自動車の決算資料(pdf)をダウンロードしてみました。
簡単解説
デモは、ライブラリを読み込んで、それを実行しているだけなんですが、ライブラリを読み込んだdownload関数に「ダウンロードするURL」と「ダウンロード後に保存するファイル名(パス)」を引数として渡して上げると、ダウンロードしてファイルをfsライブラリで書き出してくれるという内容になっています。
ライブラリの特性として、ダウンロードしたURLを任意のファイル名にする為に、request関数内にファイル名を受け渡す必要があったので、requestの第1引数に受け渡す値を追加しています。
{method: 'GET', url: url, encoding: null , saveFile:saveFile}
"saveFile:saveFile"の箇所ですね。
右辺は、送り込む変数で、左辺がrequestで受け取った後の変数になります。
同じにしているので、ややこしいかもしれませんが、この辺は使い慣れてください。
そして、request側で受け取る変数はそのままでは使えず、"response.request.saveFile"という階層で取り出すことができるようになります。
この辺はお作法として覚えておくだけでいいのですが、ここに関数を入れて送り込むことも可能です。
ダウンロード後にいろいろなコールバック関数を実行させたい時は、ここにどんどん追加してみてください。
この処理で広がる世界
とりあえず、必要に狩られて作ったライブラリですが、単体でダウンロードできるライブラリがnodejsに無いというのもちょっとだけ驚きましたが、クローリングなどをシステム開発する人は、比較的よく使う技術なのではないかと考えられます。
株価関連のシステムを組む時などは、PDFファイルでのデータのやりとりは普通に行われる為、PDFをさらにデータ検索して、任意の文字列を取り出すという事も可能になります。
※ただし、バイナリ分解などをするのは、それだけで別の技術が必要になります。
また、画像を定期的にクローリングするような場合にもこのダウンロード処理をnodejsでcronしておくだけで、簡単に実現できます。
え?cronでwgetやcurlするだけでいい?
・・・う、痛いところ突かれましたね。
コマンドが叩けるのであれば、確かにそれでもいいし、"child_process"というライブラリを使って、nodejsから直接コマンドを実行してもいいかもしれません。
それでもnodejs内でスマートにダウンロードを行いたい人や、コールバック関数を実行させたい人向けのライブラリなので、使いたい人のみ便利に使ってくだされ。
0 件のコメント:
コメントを投稿