这实际上取决于您的项目规模。如果它只是随意的,而不是完全自动化的,我强烈建议使用 Firefox 插件。
我正处于类似项目的中间。它必须分析使用 Javascript 生成的页面的 DOM。编写服务器端浏览器太难了,所以我们转向了其他一些技术:Adobe AIR、Firefox Addons、用户脚本等。
如果您不需要自动化,Fx 插件非常棒。脚本可以分析页面,向您显示结果,要求您更正不确定的部分,最后将数据发布到某个后端。你可以访问所有的 DOM,所以你不需要编写一个 JS/CSS/HTML/任何解析器(那将是一项艰巨的工作!)
另一种方法是 Adobe AIR。在这里,您可以更好地控制应用程序——您可以在后台启动它,在没有您交互的情况下进行所有解析和分析。缺点是——你无法访问页面的所有 DOM。解决这个问题的唯一方法是设置一个简单的代理,它获取目标 URL,添加一些 Javascript(以创建一个受信任的不受信任的沙箱桥)……这是一个肮脏的 hack,但它有效。
编辑:
在 Adobe AIR 中,访问国外网站的 DOM 有两种方式:
- 通过 Ajax 加载它,创建 HTMLLoader 对象,并将响应输入其中(
loadString 方法 IIRC)
- 创建 iframe,并将网站加载到不受信任的沙盒中。
我不记得为什么了,但是第一种方法对我来说失败了,所以我不得不使用另一种(我认为其中涉及一些安全原因,我无法解决)。而且我必须创建一个沙箱来访问站点的 DOM。这里有一点关于dealing with sandbox bridges。这个想法是创建一个代理,添加一个简单的 JS,创建 childSandboxBridge 并向父级(在本例中为 AIR 应用程序)公开一些方法。脚本内容类似于:
window.childSandboxBridge = {
// ... some methods returning data
}
(小心——通过沙盒桥传递的内容是有限制的——肯定没有复杂的对象!只使用原始类型)
所以,代理基本上篡改了所有返回 HTML 或 XHTML 的请求。所有其他都只是通过不变。我已经使用 Apache + PHP 完成了这项工作,但肯定可以使用带有一些插件/自定义模块的真正代理来完成。这样我就可以访问任何网站的 DOM。
编辑结束。
我知道的第三种方法,也是最难的方法——设置一个类似于browsershots 的环境。然后,您将使用具有自动化功能的 Firefox。如果您的服务器上有 Mac OS X,您可以使用 ActionScript 来为您执行自动化操作。
所以,总结一下:
- PHP/服务器端脚本 - 您必须实现自己的浏览器、JS 引擎、CSS 解析器等。完全由控制和自动化代替。
- Firefox 插件 — 可以访问 DOM 和所有东西。需要用户操作它(或至少一个具有某种自动重载功能的打开的 Firefox 会话)。用户界面很好,可以指导整个过程。
- Adobe AIR — 需要一台可以工作的台式计算机,比创建 Fx 插件更困难,但更强大。
- 自动化浏览器 — 更多的是 Web 开发的桌面编程问题。可以在没有图形环境的linux终端上设置。需要掌握黑客技能。 :)