【发布时间】:2013-06-26 07:35:15
【问题描述】:
我刚刚为 pjscrape 编写了我的第一个脚本,但我发现它运行得非常慢。我对 pjscrape 和 phantomjs 都是新手,所以我不知道哪一个是罪魁祸首。
我是从localhost加载文件,所以瓶颈肯定不在传输中。
我的 config.js 脚本如下所示:
pjs.addSuite({
url: 'http://localhost/file.html'.
scraper: function() {
var people = $('table.person');
var results = [];
$.each(people, function() {
var $this = $(this);
results.push({
firstName: $this.find('.firstName').text(),
lastName: $this.find('.lastName').text(),
age: $this.find('.age').text()
});
}
return results;
}
}
然后我只使用命令行指令here 执行 PhantomJS。
~> phantomjs pjscrape.js config.js
我在 Chrome 中运行相同的代码(只是刮板函数()),它是即时的。在 phantomjs/pjscrape 中,需要 30 秒。
任何线索是什么导致缓慢?
有没有更好的方法来做这个 DOM 屏幕抓取?也许是 nodejs 解决方案?
【问题讨论】:
-
请显示 phantom.js 节点代码。因为问题可能存在。
-
@MaksimsMihejevs 我是 phantom.js 的新手,所以我不确定包含“节点代码”的内容。我已经编辑了我的问题以显示完整的脚本。对我来说真的没什么,所有的工作都是由 pjscrape 完成的。
-
您是否衡量过执行所需时间最多的内容?由于 phantom.js 使用 QT 和 WebKit,因此您的节点将要求 phantom 运行单独的进程,该进程将启动和初始化所有复杂组件,以使“浏览器”工作。然后你可以加载东西并与之交互。初始化幻象 - 通常是一个瓶颈,因此您可以考虑将其初始化一次然后重用。请测量瓶颈区域,它可能是幻象的初始化,而不是您上面发布的脚本。
-
我知道这不是主题,但你能分享一下你是如何在 chrome 中运行它的吗?管理图书馆不是几乎不可能吗?
-
@Shy:当我说“我在 Chrome 中运行相同的代码(只是刮板函数())并且它是即时的”时,我指的是检查 DOM 并抓取的代码价值观。我在 Chrome 中的测试涉及加载静态 HTML 并针对它运行我的
scraper函数。我从不在 Chrome 中运行 phantom.js 或 pjscrape。
标签: javascript node.js screen-scraping phantomjs