PuppeteerのスクレイピングをAsync/awaitを使って同期的に呼び出す方法です。
Async/awaitについて理解できていれば普通に作れると思いますが、慣れていないと難しいと思いますので参考にしてください。
(私もハマりました。。。)
Node.jsで非同期処理を実施するAsync/awaitの基本は以下を参照してください。
想定している利用シーン
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の基本的なコードは(async()=>{から始まり、await browser.close()で終了する箇所ですが、その箇所を待機させる必要があるので、Async関数を定義します。
(B)(async()=>{をawaitで待機させます。これによりマルチスレッドで動作することを防ぎます。
(C)await browser.close();で処理の終了を検知します。そのため、try catchで処理が途中で止まらないように制御しておきます。
コメントを残す