非浏览器模拟JavaScript - 是否可能?

时间:2009-11-20 06:34:25

标签: php javascript parsing curl emulation

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

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

是否有任何PHP库? (我怀疑不是,但我可能是错的。)

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

8 个答案:

答案 0 :(得分:17)

您将需要:

  • 一个JavaScript解释器
  • 一个DOM Level 2核心和HTML实现
  • 500g非标准但常用的DOM扩展
  • 一堆DOM Level 2 Style(可能也意味着CSS解释器和布局引擎)
  • 酸奶罐,圆头剪刀和粘背塑料

组装好组件后(记得让成年人帮助你使用沙盒),你会发现你所拥有的内容基本上与网页浏览器无法区分。

  

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

将JS引擎移植到PHP将是一项艰巨的任务,并且由此产生的性能可能非常糟糕。你甚至不能真正摆脱JavaScript的近乎解决方案,因为有很多页面使用像jQuery这样的可怕复杂的库来做所有事情,这需要深入的JS支持。

我认为你不能完全用PHP做这件事。你必须连接Java / Rhino / HTMLUnit或像Mozilla这样的适当的Web浏览器。如果你的托管环境没有为你提供编译和部署那种东西所需的灵活性,你必须转向使用shell(最好是VPS)的更好的托管设置。

如果你能以其他方式避免这种不愉快,通过特殊的封装已知页面的AJAX访问,就可以做到这一点。

答案 1 :(得分:4)

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

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

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

一些类似的项目在该帖子的评论中被命名。

答案 2 :(得分:3)

您可以在服务器上运行Rhino等JavaScript引擎。

以下是一些替代方案:

  • Rhino(基于Java)
  • V8(由Chrome,C ++使用)
  • SquirrelFish(C ++)

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

答案 3 :(得分:3)

此处曾问过:headless internet browser?

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

您可以查看rhino。它使用java,从未听说过PHP端口。

您是否有义务运行实际的JavaScript?

答案 7 :(得分:0)

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

但你真的想做什么?