在C#中实现动态Web Scraper的逻辑

我期待用C#窗口forms开发Web scraper。 我想要完成的是如下:

  1. 从用户获取URL。
  2. 在WINForms中的IE UI控件(嵌入式浏览器)中加载网页。
  3. 允许用户选择文本(连续,小(不超过50个字符))。 从加载的网页。
  4. 当用户希望保留该位置( HTML DOM位置 )时,必须将其持久保存到DB中,以便用户可以在其后续访问期间使用该位置来获取该位置中的数据。

假设加载的网站是一个价格网站,并且引用的费率不断变化,我们的想法是坚持DOM层次结构,这样我下次就可以遍历它。

如果所有HTML元素都具有其id属性,我将能够这样做。 在id为null的情况下,我无法完成此操作。

有人可以建议一个有效的想法(如果可能的话,这是一个最低限度的代码片段)。

即使您可以共享一些在线资源,它也会有所帮助。

谢谢,

维杰

一种方法是将标签/样式/ id的堆栈构建到您要选择的元素。

从您想要的元素,遍历到最近的id元素。 这样你就可以摆脱大多数顶部标题等。然后构建一个序列来寻找。

例:

   

对于exmaple,您将在您的数据库中存储以下序列: [id = main],div,span,div,table或者div [class = pricearea],table

使用样式/类也可用于创建路径。 您可以选择标记,标记属性或组合。 您希望尽可能准确地使用尽可能少的元素来使其更加健壮。

如果布局很少更改,则每次都可以导航到同一位置。

我还建议您使用HTML Agility Pack或类似的东西进行DOM解析,因为IE控件很慢。

屏幕抓取很有趣,但很难在所有页面上获得100%的抓取效果。 祝好运!

经过一番谷歌搜索后,我遇到了一个相当简单的解决方案。 下面附有示例代码段。

 if (webBrowser.Document != null) { IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument;// loads the HTML DOM IHTMLSelectionObject selection = HtmlDoc.selection;// Fetches the currently selected HTML Element. IHTMLTxtRange range = (IHTMLTxtRange)selection.createRange(); IHTMLElement parentElement = range.parentElement();// Identifies the parent element targetSourceIndex = parentElement.sourceIndex; //dataLocation = range.parentElement().id; MessageBox.Show(range.text);//range.parentElement().sourceIndex } 

我在Winforms应用程序中使用了嵌入式Web浏览器 ,它加载了当前网页的HTML DOM。

IHTMLElement实例公开名为“SourceIndex”的属性,该属性为每个html元素分配唯一的id。

可以将此SourceIndex存储到DB并查询该位置的内容。 使用以下代码。

 if (webBrowser.Document != null) { IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument; IHTMLElement targetElement = null; foreach (IHTMLElement domElement in HtmlDoc.all) { if (domElement.sourceIndex == int.Parse(node.InnerText))// fetching the persisted data from the XML file. { targetElement = domElement; break; } } MessageBox.Show(targetElement.innerText); //range.parentElement().sourceIndex }