スクレイピングツール開発(2)
2019年3月2日
2019年6月13日
ツール雛形
まずはツールの雛形になるものを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のオブジェクトデータをそのまま渡せば良いだけなので、非常に楽ですね。
今後の方針
まずは、機能分類毎のモジュールを作ろう。出力機能あたりから。
コメントを投稿するにはログインが必要です。