前提・実現したいこと
electronのメインプロセス上でpuppeteerを使ってスクレイピングを行い、取得したデータをレンダラープロセス上で表示するスクリプトを書いています。
スクレイピング対象のページは無限スクロールで、投稿を上から順に、描画待ちのwait処理を挟みながら取得しようとしています。
発生している問題・エラーメッセージ
下記のようなコードを書いていたのですが、wait処理の書き方によって意図通りに動作しない(おおよそ最初のページ描画時にロードされているものしか取得できない)ことに気が付きました。
挙動を見るとスクロールが描画に追いついてしまっているので、おそらくwait処理が行えていないことが原因だと思うのですが、なぜでしょうか?
- page.evaluate内でsetTimeoutを使う
- メインプロセスでpage.waitForTimeoutを使う
該当のソースコード
let posts = new Array(); for(let i = 0; i < 10; i++){ posts = await page.evaluate(async (value) => { // 投稿の取得 let _posts = [...document.querySelectorAll("#post")]; // スクロール document.scrollingElement.scrollTop = value*500; // DEBUG console.table({ postsLength: _posts.length, scrollHeight: document.scrollingElement.scrollHeight, scrolltop: document.scrollingElement.scrollTop }); // 描画待ち(1.) await (async () => { new Promise(resolve => { console.log('1秒停止') setTimeout(resolve, 1000); }); })(); // オブジェクト化 return _posts.map((e) => { let x = new Object(); (略) return x; }) }, i); // ↓こっちなら正常に動作する(2.) // await page.waitForTimeout(1000); }
補足情報(FW/ツールのバージョンなど)
node.js 16.7.0
puppeteer 10.2.0
electron 13.2.3
chromium 93.0.4577.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。