スクレイピングツール開発(2)

34

ツール雛形

まずはツールの雛形になるものを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のオブジェクトデータをそのまま渡せば良いだけなので、非常に楽ですね。

今後の方針

まずは、機能分類毎のモジュールを作ろう。出力機能あたりから。


ブロトピ:今日のブログ更新

広告

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

wpmaster
  • wpmaster
  • フリーランスシステムエンジニアの鎌形です。
    鎌形システムエンジニアリングとして都内で活動中です。

%d人のブロガーが「いいね」をつけました。