这实际上取决于您的项目规模。如果它只是随意的,而不是完全自动化的,我强烈建议使用 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。这里有一些关于处理沙盒桥的内容。这个想法是创建一个代理,添加一个简单的 JS,创建childSandboxBridge
一些方法并将其公开给父级(在本例中:AIR 应用程序)。脚本内容类似于:
window.childSandboxBridge = {
// ... some methods returning data
}
(小心——通过沙箱桥传递的内容是有限制的——肯定没有复杂的对象!只使用原始类型)
因此,代理基本上篡改了所有返回 HTML 或 XHTML 的请求。所有其他都只是通过不变。我已经使用 Apache + PHP 完成了这项工作,但肯定可以使用带有一些插件/自定义模块的真正代理来完成。这样我就可以访问任何站点的 DOM。
编辑结束。
我知道的第三种方式,也是最难的方式——设置一个类似于browsershots的环境。然后,您将使用具有自动化功能的 Firefox。如果您的服务器上有 Mac OS X,您可以使用 ActionScript 来为您执行自动化操作。
所以,总结一下:
- PHP/服务器端脚本——您必须实现自己的浏览器、JS 引擎、CSS 解析器等。完全在控制之下并实现自动化。
- Firefox Addon — 可以访问 DOM 和所有东西。需要用户操作它(或至少一个具有某种自动重载功能的打开的 Firefox 会话)。用户界面很好,可以指导整个过程。
- Adobe AIR — 需要一台可以工作的台式计算机,比创建 Fx 插件更困难,但更强大。
- 自动化浏览器 — 更多的是 Web 开发的桌面编程问题。可以在没有图形环境的linux终端上设置。需要掌握黑客技能。:)