【问题标题】:What are the pros and cons of various ways of analyzing websites?各种网站分析方法的优缺点是什么?
【发布时间】:2010-10-29 10:48:13
【问题描述】:

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

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

关于我如何进步的想法。

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

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

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

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

【问题讨论】:

    标签: html firefox iframe yql add-on


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。我对 iFrame 的想法是让浏览器完成解析工作,这样我就可以简单地查看 DOM。这也可以让我获得标签的 CSS 属性。视觉显示会很好,因为我可以突出显示项目或让用户将鼠标悬停在它们上以获取信息。但我正在寻找所有的利弊,所以你的意见很有帮助。
    • 此外,解析元生成器标签将获得至少其中一些的 CMS。
    【解决方案2】:

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

    【讨论】:

    • YSlow 绝对是必经之路,正如 Carl 所说。但是,我认为 YSlow 提供了您要求的所有功能,包括报告。请务必查看讨论 YSlow 和一般性能的 Exceptional Performance 组:tech.groups.yahoo.com/group/exceptional-performance
    • 好的,除了猜测站点正在使用的 CMS / 框架。 :)
    【解决方案3】:

    我的建议是:

    a) 选择一种脚本语言。我建议使用 Perl 或 Python:也可以使用 curl+bash,但不支持异常处理。

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

    Python 有很多内置模块,也可以看看 www.feedparser.org

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

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

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

    【讨论】:

      【解决方案4】:

      这实际上取决于您的项目规模。如果它只是随意的,而不是完全自动化的,我强烈建议使用 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。这里有一点关于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终端上设置。需要掌握黑客技能。 :)

      【讨论】:

      • 很好的答案。我以前做过 Adob​​e AIR。你能详细说明一下吗? “通过这个的唯一方法是设置一个简单的代理,它获取目标 URL,添加一些 Javascript(以创建一个受信任的不受信任的沙箱桥)......这是一个肮脏的 hack,但它有效。”
      • 编辑了我的答案以添加有关 Adob​​e AIR 方法的更多信息。毕竟没有选择这种方法,所以我的知识有点有限。 :)
      【解决方案5】:

      我建议您先尝试选项 #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 有它的新闻提要等等......

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          • Perl
          • Python
          • .NET 语言选择
          • Java

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

          【讨论】:

            猜你喜欢
            • 2010-09-10
            • 1970-01-01
            • 2010-09-06
            • 2011-01-09
            • 1970-01-01
            • 2017-10-13
            • 1970-01-01
            • 2012-07-04
            相关资源
            最近更新 更多