2009-11-29 18 views
2

我正在为奖励信息构建一个小型专业搜索引擎。引擎将仅收集每个站点上的特定数据段。我的计划是将这个过程分成两步。在.NET中简单的屏幕抓取和分析

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

  2. 一旦HTML被拉和保存分析它通过一些脚本,并拉出我需要的段和价值(例如产品的价格值)。我的问题是,这个脚本对于每个站点都必须是唯一的,它必须能够处理非常丑陋的HTML(所以我不认为XSLT会这样做),我需要能够改变它随着目标网站的更新和更改而动态变化。我将最终拿出具体的数值并将它们写入数据库以使它们可搜索

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

回答

1
  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数量继续令我惊叹......

+0

像管道的想法!谢谢 – Riri 2009-11-30 04:55:00

+0

http://www.openpipeline.org/有一个开源的管道,适用于搜索引擎的文档处理。我还没有看过它,但它可能会给你一些想法。 要记住的另一件事是线程和可伸缩性。随着您网站的收藏增长,您将希望能够同时处理多个文档。 Windows Workflow Foundation(http://msdn.microsoft.com/en-us/netframework/aa663328.aspx)也可能能够形成你的“管道”。 – Glenn 2009-11-30 06:19:48

3

那么,我会用你描述的方式去。

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

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

我正在运行,尽快扩大这个答案尽快。

+0

我们正在谈论非常小的数据。我见过HtmlAgilityPack,太棒了! Thnaks。 – Riri 2009-11-30 04:56:13