我编写了一个 PhantomJS 应用程序来抓取我构建的网站并检查要包含的 JavaScript 文件。 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);
});
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);
请您参考如下方法:
来自文档:
Due to some technical limitations, the web page object might not be completely garbage collected. This is often encountered when the same object is used over and over again.
解决方案是在正确的时间显式调用网页对象(即在许多情况下为 page
)的 close()
。
一些示例,例如 follow.js , 通过显式关闭演示多个页面对象。