2017-06-17 18 views
0

動的なWebページ用のページスクレーパーを作成しています。ページには初期ロードがあり、短いロード時間後にコンテンツの残りの部分がロードされます。Electron(NightareJS)を使用してページ上の要素を繰り返しクリック

私は負荷を考慮し、ページからHTMLを正常に取り除いたが、すべてのコンテンツを一度に読み込むわけではありません。代わりに、GETリクエストURLを使用して指定された量のコンテンツを読み込み、そのページに[もっと取得]ボタンが表示されます。私の目的は、すべてのコンテンツがページに読み込まれるまでこの「Get More」ボタンをクリックすることです。そのような疑問がある場合、GET URL経由ですべてのコンテンツを一度にロードすることは、サーバーへの影響のためにしたくありません。

繰り返しクリックするとループや繰り返しが発生します。

const NIGHTMARE = require("nightmare"); \t \t 
 
const BETHESDA = NIGHTMARE({ show: true }); 
 

 
BETHESDA 
 
    // Open the bethesda web page. Web page will contain 20 mods to start. 
 
    .goto("https://bethesda.net/en/mods/skyrim?number_results=40&order=desc&page=1&platform=XB1&product=skyrim&sort=published&text=") 
 
    
 
    // Bethesda website serves all requested mods at once. Each mod has the class "tile". Wait for any tile class to appear, then proceed. 
 
    .wait(".tile"); 
 

 
let additionalModsPresent = true; 
 
while(additionalModsPresent) { 
 
    setTimeout(function() { 
 
    BETHESDA 
 
     .wait('div[data-is="main-mods-pager"] > button') 
 
     .click('div[data-is="main-mods-pager"] > button') 
 
    }, 10000) 
 
    
 

 
    additionalModsPresent = false; 
 
} 
 

 

 
// let moreModsBtn = document.querySelector('div[data-is="main-mods-pager"] > button'); 
 

 
    // .end() 
 
    BETHESDA.catch(function (error) { 
 
    console.error('Search failed:', error); 
 
    });

私の考えは、これまでの時間のいくつかの間隔の後、ボタンをクリックしようとし、whileループを使用することでした。エラーが発生した場合は、ボタンが存在しない可能性が高いです。私が抱えている問題は、クリックがsetTimeoutまたはsetIntervalの内部で動作するように見えないことです。スコープに関する問題があると思いますが、正確に何が起こっているのか分かりません。

clickメソッドがsetIntervalなどで機能するようになると、問題は解決されます。

思考?あなたが問題(ループ内で実行されている問題悪夢)を参照することができ

答えて

1

[https://github.com/segmentio/nightmare/issues/522]

私は与えられたガイドラインに沿ってあなたのコードを変更しました。ボタン待ち()にタイムアウトする必要があり、その後、あなたがキャッチ()ブロックでエラーを処理することができ、

const NIGHTMARE = require("nightmare"); 
const BETHESDA = NIGHTMARE({ 
    show: true 
}); 

BETHESDA 
    // Open the bethesda web page. Web page will contain 20 mods to start. 
    .goto("https://bethesda.net/en/mods/skyrim?number_results=40&order=desc&page=1&platform=XB1&product=skyrim&sort=published&text=") 

    // Bethesda website serves all requested mods at once. Each mod has the class "tile". Wait for any tile class to appear, then proceed. 
    .wait(".tile"); 

next(); 

function next() { 
    BETHESDA.wait('div[data-is="main-mods-pager"] > button') 
    .click('div[data-is="main-mods-pager"] > button') 
    .then(function() { 
     console.log("click done"); 
     next(); 
    }) 
    .catch(function(err) { 
     console.log(err); 
     console.log("All done."); 
    }); 
} 

最終的には正常に動作するようです。それが続けていることに注意してください:)私は最後まで待っていませんでした(あなたは記憶を使い果たすかもしれません)。

+0

答えをよろしくお願いいたします。私は、ソリューションのメモリ問題に遭遇したくないと思う。私はそれをやって、何度も大量のGETリクエストを送信することになると思います。私はそれが大きな問題になるとは思わない。 –

関連する問題