Phantom.js是否可以捕获所有的AJAX请求?

26

我有一个使用大量AJAX的骨干应用程序。(每个页面加载会产生5-6个ajax调用)这是因为我有许多视图和这些视图内部的内部视图,

如果我运行Phantom.js,我可以得到最终的HTML结果吗?

最终结果就是在我的所有ajax调用运行后用户看到的结果。


5
为什么不自己尝试一下呢? - Werner Kvalem Vesterås
你所说的“最终HTML”是什么意思?你是指像 document.body.innerHTML 这样的东西吗? - 11684
4个回答

35

PhamtonJs是一个带有JavaScript API的无头WebKit。在爬取页面时,PhantomJs将下载所有依赖请求,例如图片、JS、CSS等,还会执行JS和ajax调用。

然而,在页面完成加载时调用onLoaded回调函数,而不是在没有挂起的请求时调用。因此,您必须使用一个技巧来解决这个问题。

有两种方法可以解决这个问题:

  • 等待“某些事情”在您的页面中有效地发生改变(一个元素)。最好的例子是waitFor.js
  • 等待几秒钟,直到没有收到请求。

我不太了解node.js。但是waitFor.js是你需要做的基本示例。我相信你能在你的情况下轻松使用它。 - Cybermaxs

11

Phantom.js可以运行您网页中的JavaScript代码,因此这应该是可行的。有一篇文章描述了如何使用Phantom.js为网络爬虫生成漂亮的JavaScript站点版本。

请务必给Phantom.js足够的时间来完成ajax调用,正如这个帖子所描述的那样。


这里有一个失效的链接。你不应该链接到那样的东西。 - Nicholas DiPiazza
一个用于死链接的Web存档:https://web.archive.org/web/20130117045604/http://backbonetutorials.com/seo-for-single-page-apps/ - DesTroy

1
你可以使用$.active和waitFor.js脚本,它返回到服务器的活动连接数,我们需要等待它为0以完成所有请求。
更多信息:jQuery.active函数

0

如果您可以访问网站的JavaScript代码,除了使用waitFor()方式外,我认为您可以使您的ajax请求同步。这有时更简单、更准确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接