【问题标题】:Simple screen scraping and analyze in .NET.NET 中的简单屏幕抓取和分析
【发布时间】:2009-11-29 09:39:00
【问题描述】:

我正在为奖品信息构建一个小型专业搜索引擎。该引擎将仅收集每个站点上的特定数据段。我的计划是将这个过程分成两个步骤。

  1. 基于指向我需要的片段所在页面的 URL 的简单屏幕抓取。 最简单的方法是使用 WebClient 对象并获取完整的 HTML 吗?

  2. 一旦 HTML 被提取并保存,通过一些脚本对其进行分析,并仅提取我需要的部分和值​​(例如产品的价格值)。我的问题是这个脚本对于我拉的每个站点都必须是唯一的,它必须能够处理非常丑陋的 HTML(所以我认为 XSLT 不会这样做......)并且我需要能够更改它随着目标站点的更新和变化而即时更新。最后,我将获取特定值并将它们写入数据库以使其可搜索

您能否给我一些关于如何以最佳方式构建架构的提示?你会做与上述不同的事情吗?

【问题讨论】:

    标签: c# .net screen-scraping search-engine


    【解决方案1】:

    好吧,我会按照你描述的方式。

    1. 它要处理多少数据?通过 WebClient / HttpWebRequest 获取完整的 HTML 应该不是问题。

    2. 我会选择 HtmlAgilityPack 进行 HTML 解析。它非常宽容,并且可以处理非常丑陋的标记。由于 HtmlAgilityPack 支持 XPath,因此很容易为各个站点选择特定的 xpath。

    我正在奔跑,并会尽快扩展这个答案。

    【讨论】:

    • 我们谈论的是非常少的数据。我看过 HtmlAgilityPack,太棒了!谢谢。
    【解决方案2】:
    1. 是的,WebClient 可以很好地解决这个问题。 WebBrowser 控件也可以根据您的要求工作。如果您要将文档加载到 HtmlDocument(IE HTML DOM)中,那么使用 Web 浏览器控件可能会更容易。

    2. 现在内置于 .NET 中的 HtmlDocument 对象可用于解析 HTML。它旨在与 WebBrowser 控件一起使用,但您也可以使用 mshtml dll 中的实现。我没有使用过 HtmlAgilityPack,但我听说它可以完成类似的工作。

    HTML DOM 对象通常会处理并修复您扔给它们的最丑陋的 HTML。除了允许以更好的方式解析 html 之外,document.GetElementsByTag 还可以获取标签对象的集合。

    至于处理网站不断变化的需求,strategy pattern 听起来不错。您可以使用反射或类似的方式为每个站点加载策略。

    我曾在一个系统上工作,该系统使用 XML 定义一组通用参数,用于从 HTML 页面中提取文本。基本上,它将定义开始和结束元素以开始和结束提取。我发现这种技术对于一个小样本来说已经足够好用了,但是随着站点的集合变得越来越大,它变得相当麻烦并且难以定制。使 XML 保持最新并尝试保持一组通用的 XML 和代码来处理任何类型的站点都是很困难的。但如果网站的类型和数量很少,那么这可能会奏效。

    最后要提到的是,您可能希望在您的方法中添加一个清理步骤。在流程中清理 HTML 的灵活方法对我过去编写的代码非常有用。如果您认为域足够复杂以保证它的存在,那么实现pipeline 类型可能是一个好方法。但即使只是一个在解析 HTML 之前在 HTML 上运行一些正则表达式的方法也很有价值。摆脱图像,用更好的 HTML 替换特定的误用标签等。那里的真正狡猾的 HTML 的数量继续让我感到惊讶......

    【讨论】:

    • 喜欢管道的想法!谢谢
    • openpipeline.org 有一个面向搜索引擎文档处理的开源管道。我还没有看过它,但它可能会给你一些想法。另一件要记住的事情是线程和可伸缩性。随着站点集合的增长,您将希望能够同时处理多个文档。 Windows Workflow Foundation (msdn.microsoft.com/en-us/netframework/aa663328.aspx) 也可能能够形成您的“管道”。
    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多