3

我想编写一些代码来查看网站及其资产并创建一些统计数据和报告。资产将包括图像。我希望能够跟踪链接,或者至少尝试识别页面上的菜单。我还想根据类名等猜测一下 CMS 创建了该站点的原因。

我将假设该站点是相当静态的,或者由 CMS 驱动,但与 RIA 不同。

关于我如何进步的想法。

1) 将网站加载到 iFrame 中。这会很好,因为我可以用 jQuery 解析它。或者我可以吗?似乎我会受到跨站点脚本规则的阻碍。我已经看到解决这些问题的建议,但我假设浏览器将继续压制这些问题。小书签会有帮助吗?

2) 一个火狐插件。这可以让我解决跨站点脚本问题,对吗?似乎可行,因为 Firefox(和 GreaseMonkey,就此而言)的调试工具可以让你做各种各样的事情。

3) 在服务器端抓取网站。使用服务器上的库进行解析。

4) YQL。这不是为解析站点而构建的吗?

4

7 回答 7

7

我的建议是:

a) 选择一种脚本语言。我建议 Perl 或 Python:还有 curl+bash,但没有异常处理很糟糕。

b) 通过脚本加载主页,使用 python 或 perl 库。试试 Perl WWW::Mechanize模块。

Python 有很多内置模块,试试看 www.feedparser.org

c) 检查服务器标头(通过 HTTP HEAD 命令)以查找应用程序服务器名称。如果幸运的话,您还会找到 CMS 名称(id WordPress 等)。

d) 使用 Google XML API 询问“link:sitedomain.com”之类的内容以查找指向该站点的链接:您将再次在 google 主页上找到 Python 的代码示例。向 Google 询问域名排名也会有所帮助。

e)您可以在 SQLite 数据库中收集数据,然后在 Excel 中对其进行后期处理。

于 2009-06-01T13:22:44.363 回答
3

您应该简单地获取源代码 (XHTML/HTML) 并对其进行解析。你几乎可以用任何现代编程语言来做到这一点。从您自己的连接到 Internet 的计算机。

iframe 是用于显示 HTML 内容的小部件,它不是用于数据分析的技术。您可以在不显示任何地方的情况下分析数据。你甚至不需要浏览器。

对于您的任务,Python、Java、PHP 等语言的工具肯定比 Javascript 或您在那些 Firefox 扩展中拥有的任何工具更强大。

网站背后的技术也无关紧要。XHTML/HTML 只是一个字符串,不管浏览器如何呈现它。要找到您的“资产”,您只需查找特定的 HTML 标签,如“img”、“object”等。

于 2009-05-28T01:27:09.767 回答
3

我认为为Firebug编写扩展可能是最简单的方法之一。例如, YSlow是在 Firebug 之上开发的,它提供了一些您正在寻找的功能(例如图像、CSS 和 Javascript-summaries)。

于 2009-05-31T09:10:20.573 回答
3

我建议您首先尝试选项 #4 (YQL):原因是它看起来可能会为您提供所需的所有数据,然后您可以将您的工具构建为网站,或者您可以在没有实际的情况下获取有关网站的信息必须转到浏览器中的页面。如果 YQL 可以满足您的需求,那么您似乎可以使用此选项获得最大的灵活性。

如果 YQL 没有成功,那么我建议您使用选项 #2(firefox 插件)。

我认为您可能应该尝试远离选项 #1(Iframe),因为您已经知道跨站点脚本问题。

此外,我使用了选项#3(在服务器端抓取网站),我过去遇到的一个问题是网站在使用 AJAX 调用之后被抓取加载内容。当时我没有找到一个很好的方法来获取使用 AJAX 的页面的全部内容——所以要小心那个障碍!这里的其他人也遇到过这种情况,请参阅:Scrape a dynamic website

AJAX 动态内容问题: 可能有一些解决 ajax 问题的方法,例如使用 AJAX 本身抓取内容并使用 evalScripts:true 参数。请参阅以下文章以获取更多信息以及您可能需要注意的有关从被抓取内容中评估 javascript 如何工作的问题:

原型库: http: //www.prototypejs.org/api/ajax/updater

留言板:http ://www.crackajax.net/forums/index.php?action=vthread&forum=3&topic=17

或者如果你愿意花钱,看看这个: http ://aptana.com/jaxer/guide/develop_sandbox.html

这是一个丑陋(但可能有用)的示例,它使用称为 WebRobot 的 .NET 组件从支持动态 AJAX 的站点(例如 Digg.com)中抓取内容。 http://www.vbdotnetheaven.com/UploadFile/fsjr/ajaxwebscraping09072006000229AM/ajaxwebscraping.aspx

这里还有一篇关于使用 PHP 和 Curl 库从网页中删除所有链接的一般文章。但是,我不确定这篇文章和 Curl 库是否涵盖了 AJAX 内容问题: http ://www.merchantos.com/makebeta/php/scraping-links-with-php/

我刚刚想到的一件事可能会起作用:

  1. 抓取内容并使用 AJAX 对其进行评估。
  2. 将内容发送到您的服务器。
  3. 评估页面、链接等。
  4. [可选] 将内容保存为服务器上的本地页面。
  5. 将统计信息返回到页面。
  6. [可选] 高亮显示缓存的本地版本。

^注意:如果保存本地版本,您将需要使用正则表达式将相对链接路径(尤其是图像)转换为正确的。

祝你好运!请注意 AJAX 问题。现在许多网站使用 AJAX 动态加载内容。Digg.com 有,MSN.com 有它的新闻提要,等等......

于 2009-06-05T17:39:50.717 回答
2

这实际上取决于您的项目规模。如果它只是随意的,而不是完全自动化的,我强烈建议使用 Firefox 插件。

我正处于类似项目的中间。它必须分析使用 Javascript 生成的页面的 DOM。编写服务器端浏览器太难了,所以我们转向了其他一些技术:Adobe AIR、Firefox Addons、用户脚本等。

如果您不需要自动化,Fx 插件很棒。脚本可以分析页面,向您显示结果,要求您更正不确定的部分,最后将数据发布到某个后端。你可以访问所有的 DOM,所以你不需要编写一个 JS/CSS/HTML/任何解析器(那将是一个地狱般的工作!)

另一种方法是 Adob​​e AIR。在这里,您可以更好地控制应用程序——您可以在后台启动它,在没有您交互的情况下进行所有解析和分析。缺点是——您无法访问页面的所有 DOM。解决这个问题的唯一方法是设置一个简单的代理,它获取目标 URL,添加一些 Javascript(以创建一个受信任的不受信任的沙箱桥)……这是一个肮脏的 hack,但它有效。

编辑: 在 Adob​​e 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终端上设置。需要掌握黑客技能。:)
于 2009-06-01T15:19:22.087 回答
0

现在主要是 .Net 程序员,我的建议是使用 C# 或其他带有 .Net 绑定的语言。使用WebBrowser控件加载页面,然后遍历文档中的元素(通过GetElementsByTagName())以获取链接、图像等。通过一些额外的工作(解析 BASE 标记,如果可用),您可以解决src 和 href 属性添加到 URL 中,并使用HttpWebRequest为目标图像发送 HEAD 请求以确定它们的大小。这应该让您了解页面的图形密集程度,如果这是您感兴趣的内容。您可能有兴趣包含在统计信息中的其他项目可能包括反向链接/页面排名(通过 Google API),页面是否验证为 HTML 或 XHTML,链接到同一域中的 URL 与非站点链接的百分比,以及如果可能的话,Google 对各种搜索字符串页面的排名(但不知道是否可以通过编程方式获得)。

于 2009-06-05T19:21:03.997 回答
0

我会使用一个脚本(或根据选择的语言编译的应用程序),该脚本是用一种对网络和文本解析/正则表达式有强大支持的语言编写的。

  • Perl
  • Python
  • .NET 语言选择
  • 爪哇

任何您最熟悉的语言。一个基本的独立脚本/应用程序让您无需过多担心浏览器集成和安全问题。

于 2009-06-05T20:57:49.090 回答