スクレイピングツール開発(2)
2019年3月2日
2019年6月13日
382

ツール雛形
まずはツールの雛形になるものをNode.jsで少し書いてみようと先月作りました。
これは某サイトの管理情報をID指定で指定秒数間隔で取得・スクレイピングして、ローカルのMongoDBに保存するものです。
Node.jsはわりと最近書き出したのですが、未だにコールバックやPromiseの書き方が慣れませんね。。。
というか、非同期処理が慣れませぬ。。。
/** * 任意のID範囲のデータ取得・DB保存 スクリプト * <使用方法> * node .\getCinemaDetail.js (開始ID) (終了ID) (実行間隔ms) */ const httpClient = require('cheerio-httpcli'); const url = "URL"; const MongoDB = require('mongodb'); const MongoClient = MongoDB.MongoClient; const dbURL = 'mongodb://localhost:27017'; const dbName = 'test1'; const collectName = 'movie'; var startCount = process.argv[2]; const endCount = process.argv[3]; const interval = process.argv[4]; function getCinemaDetail(){ var cinemaId = ++startCount; if(cinemaId > endCount){ clearInterval(timer1); return; } var param = { cinema_id: cinemaId}; var movieItem = { title : "" }; var mClient; var db; httpClient.fetch(url, param) .then((resp) => { if(resp.$('h1').text() === ""){ return Promise.reject("HTTP Get Error!!"); } movieItem['title'] = resp.$('h1').text().trim(); // スクレイピング return Promise.resolve(); }).then(() => { return MongoClient.connect(dbURL,{ useNewUrlParser: true }); }).then((client) => { mClient = client; db = mClient.db(dbName); return db.collection(collectName).insertOne(movieItem); }).then((result) => { console.log({ count: result.insertedCount, message: 'Inserted documents', cinema_id: cinemaId }); }).catch((error) => { console.log({ message: error, cinema_id: cinemaId }); }).finally(() => { if(mClient !== undefined){ mClient.close(); } }); } var timer1 = null; // httpクライアントオプション httpClient.set("timeout", 60000); // メイン処理 timer1 = setInterval(getCinemaDetail, interval);
MongoDBを使用すればあらかじめテーブルスキーマを用意する必要ないし、Node.jsのオブジェクトデータをそのまま渡せば良いだけなので、非常に楽ですね。
今後の方針
まずは、機能分類毎のモジュールを作ろう。出力機能あたりから。
コメントを投稿するにはログインが必要です。