【问题标题】:Interpreting JavaScript in PHP在 PHP 中解释 JavaScript
【发布时间】:2024-04-30 14:45:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你到底为什么要这么做?!?!?如果您必须这样做,您可以编译并运行 CLI JavaScript 解释器:code.google.com/p/v8.
  • 出于什么目的? PHP 已经有大量的日期函数。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我很高兴您指出了文档和窗口的问题,该特定问题没有被点击。我想如果我最终想要解决这个问题,我会按照你的建议写一个 PHP 模块。
  • @KitSunde 看看硒。它允许您控制任何语言的浏览器。对于 node.js,node 开发人员倾向于放弃 node.js 并改用 phantom.js,所以即使是 node 开发人员也会面临这个问题。 Phantom.js 不是 node.js,也不是 node.js 的库(尽管有一些库允许 node 控制 phantom)。 Phantomjs 是一个浏览器而不是解释器(它是 Google Chrome 的一个分支),带有窗口、选项卡等,但窗口永远不会在屏幕上绘制。这是一个无头浏览器。
  • @slebetman 谢谢,自从我问这个问题以来,我已经在 7 年里意识到了硒。 :p
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我以前从未见过 envjs,这真的很有趣。我会进一步研究,谢谢。 :)
    • 不客气。祝你好运。 (不要被反对者气馁)。