構築したサイトをクロールし、JavaScriptファイルが含まれているかどうかを確認するPhantomJSアプリを作成しました。JavaScriptはGoogleに似ており、一部のインラインコードが別のJSファイルに読み込まれます。アプリは他のJSファイルを検索するため、Phantomを使用しました。
期待される結果は何ですか?
コンソール出力は、大量のURLを読み取り、スクリプトがロードされているかどうかを通知する必要があります。
本当に何が起こっているのですか?
コンソール出力は、約50のリクエストに対して期待どおりに読み取られ、次のエラーを吐き出し始めます。
2013-02-21T10:01:23 [FATAL] QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe
QEventDispatcherUNIXPrivate(): Unable to create thread pipe: Too many open files
これは、ページを開いてスクリプトを検索するコードのブロックです。
page.open(url, function (status) {
console.log(YELLOW, url, status, CLEAR);
var found = page.evaluate(function () {
if (document.querySelectorAll("script[src='***']").length) {
return true;
} else { return false; }
});
if (found) {
console.log(GREEN, 'JavaScript found on', url, CLEAR);
} else {
console.log(RED, 'JavaScript not found on', url, CLEAR);
}
self.crawledURLs[url] = true;
self.crawlURLs(self.getAllLinks(page), depth-1);
});
クロールされたURLオブジェクトは、私がすでにクロールしたURLのオブジェクトにすぎません。scrollURLs関数は、getAllLinks関数からのリンクを通過し、クローラーが開始したドメインのベースドメインを持つすべてのリンクでopen関数を呼び出します。
編集
コードの最後のブロックを次のように変更しましたが、それでも同じ問題が発生します。ファイルにpage.close()を追加しました。
if (!found) {
console.log(RED, 'JavaScript not found on', url, CLEAR);
}
self.crawledURLs[url] = true;
var links = self.getAllLinks(page);
page.close();
self.crawlURLs(links, depth-1);