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

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

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

  3. 请您给我一些关于如何构建最佳方法的提示?你会做上面描述的不同吗?

有帮助吗?

解决方案

  1. 是的,WebClient可以很好地解决这个问题。 WebBrowser控件也可以根据您的要求工作。如果要将文档加载到HtmlDocument(IE HTML DOM)中,则可能更容易使用Web浏览器控件。

  2. 现在内置于.NET中的HtmlDocument对象可用于解析HTML。它被设计为与WebBrowser控件一起使用,但您也可以使用mshtml dll中的实现。我曾经使用过HtmlAgilityPack,但我听说它可以做类似的工作。

  3. HTML DOM对象通常会处理并修复你向它们抛出的最丑陋的HTML。除了允许更好的方式来解析html,document.GetElementsByTag以获取标签对象的集合,例如。

    至于处理网站不断变化的要求,它听起来像策略模式。您可以使用反射或类似的东西为每个站点加载策略。

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

    最后要提到的是,您可能希望为您的方法添加清洁步骤。在进入流程时清理HTML的灵活方法对我过去编写的代码非常宝贵。如果你认为域名是一个好的方法,也许实施一种管道将是一个很好的方法复杂到足以保证它。但是,即使只是一种在解析它之前对HTML运行一些正则表达式的方法也很有价值。摆脱图像,用更好的HTML等替换特定的误用标签。那里真正狡猾的HTML的数量继续令我惊讶......

其他提示

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

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

<强> 2 我会去 HtmlAgilityPack 进行HTML解析。这是非常宽容的,可以处理丑陋的标记。由于HtmlAgilityPack支持XPath,因此为各个站点选择特定的xpath非常容易。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top