Nodejsのrequestとfsライブラリを使って、データダウンロードをする方法

2018年8月30日

Nodejs テクノロジー プログラミング

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内でスマートにダウンロードを行いたい人や、コールバック関数を実行させたい人向けのライブラリなので、使いたい人のみ便利に使ってくだされ。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ