我编写了一个 PhantomJS 应用程序来爬取我构建的网站并检查要包含的 JavaScript 文件。JavaScript 类似于谷歌,其中一些内联代码加载到另一个 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);
});
crawledURLs 对象只是我已经爬过的 url 的一个对象。crawlURLs 函数只是遍历 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);