Node.jsで暗号資産アービトラージ

ビットコイントレード中心にNode.jsで実際に作るためのレシピ

Puppeteerのスクレイピングを同期的に呼び出す(Async/await)

PuppeteerのスクレイピングをAsync/awaitを使って同期的に呼び出す方法です。
Async/awaitについて理解できていれば普通に作れると思いますが、慣れていないと難しいと思いますので参考にしてください。
(私もハマりました。。。)


Node.jsで非同期処理を実施するAsync/awaitの基本は以下を参照してください。
www.kennejs.com


想定している利用シーン

Puppeteerはリソースを消費が激しいため貧弱な環境ではマルチタスクで実行するとサーバーがハングアップに近い状態になります。


溜まったchromeプロセスをkillしていけばいいのですが、その間スクレイピングが動かなくなると困るのでPuppeteerのタスク(関数)をまとめて実行します。

具体的なコード

それでは具体的なコードを交えて説明していきます。
呼び出し元、呼び出し先でファイルを分けています。


operateXXX関数が実際のスクレイピングを行なっている関数となります。

operation.js
module.exports = {
  // (A)Async関数で定義する
  operateXXX: async function(){
    // (B)同期的に制御しているAsync関数をawaitで待機する
    await (async () => {
      try{
        const browser = await puppeteer.launch({});
        const page = await browser.newPage();
        await page.goto('https://xxx.co.jp/');
        ~~~
        // (C)関数を終了させるためにbrowser.close()を記述する
        await browser.close();
      }catch(e){
        await browser.close();
      }
    })();
  },
  // 呼び出し元もasync関数で定義する
  callAsync: async function(){
    // スクレイピングの関数をawaitで待機させる
    await this.operateXXX()
    await this.operateXXX()
  }
}

(A)Puppeteerのコードをasync関数で挟みます。Puppeteerの基本的なコードhttps://www.kennejs.com/entry/2019/01/18/020001は(async()=>{から始まり、await browser.close()で終了する箇所ですが、その箇所を待機させる必要があるので、Async関数を定義します。


(B)(async()=>{をawaitで待機させます。これによりマルチスレッドで動作することを防ぎます。


(C)await browser.close();で処理の終了を検知します。そのため、try catchで処理が途中で止まらないように制御しておきます。



calloperation.jsは呼び出し側のコードの記載です。

calloperation.js
const operation = require('./operation.js');
~~~
operation.callAsync();

一つ一つ見ていくとそこまで難しくないので、実装してみてください。

ビットコインを購入するならBITPOINT
BITPOINT