15

我希望能够运行 JavaScript 并使用 PHP 获得结果,并且想知道是否有一个 PHP 库可以让我解析它。我的第一个想法是使用 node.js,但由于 node.js 可以访问套接字、文件和其他东西,我想我宁愿避免这种情况。

基本原理:我正在使用 PHP 进行屏幕抓取,并且遇到了许多数据由前端的 JavaScript 生成的场景,并且我想避免编写专门的过滤函数来基于每个案例对 JavaScript 进行操作,因为那需要很多时间。更一般的情况是直接解析 JavaScript。

Downvoting:我真的不明白这个问题有什么争议,现代网络爬虫都知道这样做,唯一的区别是它们往往不是用 PHP 编写的。[1]

[1] http://blogs.forbes.com/velocity/2010/06/25/google-isnt-just-reading-your-links-its-now-running-your-code/

4

3 回答 3

6

这是一个有趣的问题,反对者对潜在的用例缺乏想象力。页面归档工具、打印脚本、预览图像——所有想要使用页面中包含的 JavaScript 操作文档的正当理由。

我不知道任何现有的 PHP 实现,但您可能会将 Mozilla 的SpiderMonkey改编为 PHP 模块,或者作为操作 DOMDocument 并返回结果的独立工具。

我没有使用服务器端 JavaScript 的经验,但我认为可能需要处理一些问题:

  • 宿主对象与 ECMAScript 规范类似document且不window属于 ECMAScript 规范(这些是实现浏览器提供的对象),因此您需要确保库提供等效的宿主对象。
  • 在服务器端环境中执行客户端脚本可能存在安全问题。这很像允许用户提交一个 PHP 脚本进行评估,因此您需要确保安全沙箱是严密的。

另一个(也许)更安全、更容易实现的选项可能是使用经过修改的 FireFox 或 WebKit 实例,该实例作为浏览器运行,加载目标页面并将修改后的源返回到您的应用程序。

于 2010-12-04T23:53:17.503 回答
4

从 PHP 5.3 开始,您可以使用PHP 的 V8JS 扩展。它是一个原生库,使用新的 Google V8 Javascript 引擎来执行 JS 并返回结果。

这很好,因为您可以在 PHP 数组中传递 var 并且被很好地解释

于 2013-10-21T10:45:12.093 回答
1

NodeJS(或谷歌 v8 的其他衍生产品)实际上可能是最好的方式。如果您担心 nodejs 可以做的各种事情(例如套接字等),您可能可以通过删除模块和/或插件来“剥离它”——我认为即使是内置的东西最终也是以这样的方式实现的这样它就可以很容易地被剥离出来。

另一种方法可能是简单地替换、覆盖或require删除node.js.

还有envjs应该可以更轻松地运行旨在运行浏览器的 js。

于 2010-12-04T22:13:24.097 回答