26

我有一个拥有大量 AJAX 的骨干应用程序。(每个页面加载会导致 5-6 次 ajax 调用)因为我在这些视图中有很多视图和内部视图,

如果我运行 Phantom.js,我能得到最终的 html 结果吗?

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

4

4 回答 4

35

PhamtonJs 是一个带有 JavaScript API 的无头 WebKit。在爬取页面时,PhatomJs 会下载图片、js、css 等所有依赖请求……它还会执行 JS 和 ajax 调用。然而,当页面完成加载时调用 onLoaded 回调,而不是在没有挂起请求时调用。所以,你必须为此使用一个技巧。

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

  • 等到你的页面(一个元素)中的“某些东西”有效地改变了。最好的例子是waitFor.js
  • 等待几秒钟,直到没有收到任何请求。
于 2013-02-10T15:27:57.637 回答
11

Phantom.js 能够在您的页面中运行 javascript,所以这应该可以工作。有一篇文章描述了如何使用 Phantom.js 为爬虫提供漂亮的 javascript 网站版本。

一定要给 Phantom.js 足够的时间来完成 ajax 调用,正如这个线程所描述的。

于 2013-02-10T15:07:30.183 回答
1

您可以将 $.active 与 waitFor.js 脚本一起使用,该脚本返回与服务器的活动连接数,我们需要等待它为 0 才能完成所有请求。

更多信息:jQuery.active 函数

于 2015-04-26T18:22:43.153 回答
0

如果您可以访问网站的 javascript 代码,除此之外waitFor(),我认为您可以使您的 ajax 请求同步。它有时更简单,更准确。

于 2017-03-13T04:21:05.113 回答