用PHP解释JavaScript

时间:2010-12-02 05:19:51

标签: php javascript screen-scraping node.js serverside-javascript

我希望能够运行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/

3 个答案:

答案 0 :(得分:5)

这是一个有趣的问题,而下行选民对潜在的使用案例缺乏想象力。页面存档工具,打印脚本,预览图像 - 所有正当理由都希望使用页面中包含的JavaScript来操作文档。

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

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

  • documentwindow等主机对象不是ECMAScript规范的一部分(这些是实现浏览器提供的对象),因此您需要确保该库提供等效的主机对象。
  • 在服务器端环境中执行客户端脚本时可能存在安全问题。这很像允许用户提交PHP脚本进行评估,因此您需要确保安全沙箱紧张。

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

答案 1 :(得分:4)

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

这很好,因为你可以在PHP数组中传递vars并且解释得非常好

答案 2 :(得分:1)

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

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

还有envjs,这样可以更轻松地运行用于运行浏览器的js。