世の中のWEBサイトははSSL,TLSが必須の時代です。
それもこれもブラウザでhttpポートにアクセスしたら「保護されていない通信」というメッセージがURL欄に表示されます。(GoogleChromeの場合)
そんなセキュリティにうるさいGoogleがGoogle+サービスから個人情報漏洩をしていたというニュースが流れていたのを聞いて、最先端の技術会社のイメージから、「どの口から言うてんねん!」という思いの会社に変わってしまいますよね。
でも、世の中は通信時にデータを横取りされるリスクを回避するためにhttpsアクセスがマストになる事は避けられません。
そして、今回金融庁の「Edinet」という、企業(主に上場企業)の有価証券報告書など、財務情報をダウンロードするサービスを構築している時にハマった点とその解決方法を記載しておきます。
ハマりポイント
金融庁の「Edinet」サイトでXBRLというデータをダウンロードするという内容です。
ちなみに、このダウンロードは、クローリングにて行うため、nodejsを利用して行なっていました。
手順としては、以下のようなフローになります。
1. ダウンロードするURLにアクセス
2. XBRLのダウンロードボタンをクリック
3. 任意のURLが発行されるので、requestイベントで取得
4. 取得したURLをrequestモジュールを利用してレスポンスデータを任意ファイル名で書き出し
この時に、金融庁のサイトはhttpsであるため、どうしても「Error: unable to get local issuer certificate」というエラーが出て正常にデータダウンロードができません。
どうやら、TLS認証でエラーがでているのは間違い無い様子です。
解決方法
解決方法は非常に簡単で、requestのoptionsに、「rejectUnauthorized = false」を加えるだけです。
その際のrequest記述は以下のようになります。
request.get({
url : "https://disclosure.edinet-fsa.go.jp/download?sec=E00001",
encoding : null,
rejectUnauthorized: false,
saveFile : "DownloadFile.zip"
},
function (error, response, body){
if(!error && response.statusCode === 200){
fs.writeFileSync(response.request.saveFile , body, 'binary');
}
});
色々と端折って履いてますが、request.getのoptions部分の「rejectUnauthorized: false,」を加えただけで、ダウンロードが正常にできるようになりました。
ちなみに、zipファイルなどのバイナリデータの場合は、「encoding : null,」をつけておく方がデータが安定するようです。
今後のクローリングでデータをダウンロードする時には必須のオプションかもしれませんね。
0 件のコメント:
コメントを投稿