私は、Webサイトのすべてのページを繰り返し処理して情報を抽出するスクレイパーを作成しました。たくさんのページがあります。このプログラムがノンストップで機能していれば、完了するまでに約1週間かかります。しかし、2〜3時間ごとにページから情報を抽出しようとするとハングするだけで、それは決して続かない。私はスクリプトを再起動する必要があるので、これはイライラしています。ここでNodeJSを使用して実行することの骨格は、次のとおりです。JavaScript関数を別のJavaScript関数から定期的に削除して再起動する方法
index = 0;
finalIndex = 50000;
function scrape(){
if(index < finalIndex){
//hit the website using nightmare, navigate to page, extract info, store as JSON
console.log("finished scraping page number: ", index);
index++;
scrape();
}
}
scrape();
私は掻き取り機能を実行される、このファイルまたは別では、機能を持っているしたいのですが、その後、2時間ごとに機能を殺して、それを再起動しますそれが掻き取ろうとした最後のインデックスから。私はsetTimeoutを使って公式を考えようとしましたが、関数スタックを途中で止める方法がわかりません。また、スクレイプ機能がすでに停止している場合、再起動機能が失敗することも望ましくありません。
これを行うには、どのような方法が最適ですか?この問題に対するその他の解決策は歓迎ですが、JavaScriptの知識の観点からも、私はこれを将来行う方法を知りたいと思います。ここで
は、もう少し詳細に私の関数である。
function scrape() {
console.log("initializing scrape from index: " + index);
var nightmare = Nightmare();
if (index < indexEnd) {
nightmare
.goto(hidTestURL) //connect to the main site
.wait('input[name="propertySearchOptions:advanced"]')
.wait(4000)
.goto(pageURL) //navigate to the specific entry's info page
.wait('a[id="propertyHeading_searchResults"]')
.wait(2500)
.evaluate(function(){
return document.querySelector('body').innerHTML;
})
.then(function(html){
return xP([html, {data: css.data}])() //scrape the data from the page
})
.then(cleanDetails)
.then(writeResult)
.then(_ => {
nightmare.end();
nightmare.proc.disconnect();
nightmare.proc.kill();
nightmare.ended = true;
nightmare = null;
})
.then(function(){
console.log("successful scrape for ", ids[index]);
++index;
setTimeout(scrape(), interval); //start scraping the next entry after a specified delay (default 4 seconds)
})
.catch(function(e){
if (e.message === 'EmptyProperty'){
console.log('EmptyProperty');
++index;
setTimeout (scrape, interval/2);
}
else {
return appendFileP(logFile, new Date().toString() + " unhandled error at " + street + index + ' ' + e + '\r\n', 'utf8')
.then(function(){
if (numOfTries < 2){
console.log("Looks like some other error, I'll retry: %j", e.message);
++numOfTries;
setTimeout (scrape, interval * 5);
return nightmare.end();
}
else {
console.log("Tried 3 times, moving on");
++index;
numOfTries = 0;
setTimeout (scrape, interval * 5);
return nightmare.end();
}
});
}
})
}
そのコードが、私は含まれていませんが、それらの名前が明らかでなければならない、と私はその機能があるとは思わないヘルパー関数があります。問題の重要な部分。また、Nodeを使用してこれを実行していることを明確にしたいので、ブラウザで実行することはありません。
を。 (私が間違っていると誰かに教えてください) 実行や読み込みに時間がかかりすぎると、ブラウザはプロセスを強制終了させることがあります。 EDITED しかしNodejsはJavascriptではありません。あなたはNode.jsのプロセスをkillすることができます –
あなたのメソッドから離れすぎないようにしようとしないでください。おそらく、ここに記述されているようなものを試すことができます:http://stackoverflow.com/questions/672732/prevent-long-running-javascript- from-locking-up-browser –
コードが何をハングアップさせるのかを見つけ出して修正します。それまでは、OSに付属のタスクスケジューラを使用して、2時間ごとに 'node'プロセスを強制終了して再起動することができます。 – Bergi