10

我有一个正在处理的新项目,涉及获取网页,(使用 PHP 和 cURL)解析 HTML 和 javascript,然后处理结果中的数据。

基本上,当网站使用 javascript 通过 AJAX 获取其数据时,我遇到了障碍。在这种情况下,除非在浏览器中运行 javascript,否则初始数据不会出现在获取的页面中。

有没有这方面的 PHP 库?(我怀疑不是,但我可能是错的。)

我真的宁愿将其构建为基于服务器的解决方案,否则我不得不为此构建应用程序并使用 mozilla 和/或 IE 运行时库——这违背了目的。

4

8 回答 8

17

你会需要:

  • 一个 JavaScript 解释器
  • 一个 DOM Level 2 Core 和 HTML 实现
  • 500g 非标准但常用的 DOM 扩展
  • 一小撮 DOM 2 级样式(这也可能意味着 CSS 解释器和布局引擎)
  • 酸奶罐、圆头剪刀和粘性塑料

一旦你组装了你的组件(记得找一个大人来帮助你进行沙盒操作),你会发现你所拥有的基本上与 Web 浏览器没有区别。

JAVA 不是在服务器上构建的 shell 的一部分。V8/SquirrelFish 是我需要转换为 PHP 的 C++ 代码。

将 JS 引擎移植到 PHP 将是一项艰巨的任务,并且由此产生的性能可能很糟糕。你甚至无法真正摆脱几乎在 JavaScript 上的解决方案,因为如此多的页面使用 jQuery 等极其复杂的库来完成所有工作,这需要深入的 JS 支持。

我不认为你将能够纯粹在 PHP 中做到这一点。您必须连接 Java/Rhino/HTMLUnit 或像 Mozilla 这样的适当网络浏览器。如果您的托管环境不能为您提供编译和部署这类东西所需的灵活性,那么您必须使用外壳(最好是 VPS)转移到更好的托管设置。

如果您可以通过其他方式避免这种不愉快,通过对已知页面的 AJAX 访问进行特殊处理,请执行此操作。

于 2009-11-20T14:03:00.163 回答
4

您可以在服务器上运行 JavaScript 引擎,例如 Rhino。

这里有几个选择:

  • Rhino(基于 Java)
  • V8(由 Chrome、C++ 使用)
  • 松鼠鱼 (C++)

虽然这些可以运行 JS,但我不确定你所做的是否是最好的方法。但是,由于您尚未指定程序的目的,因此我无法就此提供任何建议。

于 2009-11-20T06:38:37.783 回答
4

如果你想执行真实的实时网页,你必须比 Rhino 更进一步,因为这些页面上的 JavaScript 将期望能够使用浏览器环境的原生对象。像 Rhino 这样的服务器端 JavaScript 引擎不会有这些对象。

John Resig(jQuery 的创建者)几年前开始了一个名为Env.js的项目。这可能是您正在寻找的东西,但我怀疑您将很难从各种网页中获得一致的结果。这是他最初的博客文章:

http://ejohn.org/blog/bringing-the-browser-to-the-server/

该帖子的评论中提到了一些类似的项目。

于 2009-11-20T07:02:28.267 回答
3

以前在这里问过:无头互联网浏览器?

在 Mozilla,我们经常遇到这个问题。没有好的答案。你想要的是一个软件库,它实现了浏览器需要做的几乎所有事情(至少就网络、JavaScript、HTML 解析和 DOM 而言),但没有显示。

我所知道的最接近的是HTMLUnit(在 Java 中)。

于 2009-11-20T07:22:39.987 回答
1

我知道您说过没有 Java,但作为参考,您可能对QT Jaambi感兴趣。他们有一个 webkit 的实现,你可以在无头模式下运行。

于 2009-11-20T14:07:04.050 回答
1

所有这些答案似乎都假定没有 php JavaScript 仿真的可能性,但这里有一个几乎完全兼容的开源 php JavaScript 仿真器:

http://www.sitepoint.com/blogs/2006/01/19/j4p5-javascript-for-php5/

结合 Env.js,您可以非常接近完整的服务器端 js 执行解决方案。

于 2010-08-16T20:23:36.337 回答
0

你可以看看犀牛。它使用 java,从未听说过 PHP 端口。

你有义务运行实际的 javascript 吗?

于 2009-11-20T06:36:51.563 回答
0

Tbh 您将很难仅使用 JS 引擎,因为您还必须创建浏览器脚本引擎的环境,例如 DOM 和窗口对象。如果您在 Windows 服务器上运行,那么您可以相当轻松地使用 IE COM 对象来加载和执行网页,以编程方式访问 DOM 并将内容拉回。至于您的服务器是 Linux 和/或 Mozilla,我很遗憾没有经验。

但你真的想做什么?

于 2009-11-20T06:48:20.747 回答