2012-02-28 220 views
2

我正在使用C#中的Microsoft .NET应用程序进行Web收集,Web抓取,Web数据提取,屏幕抓取,等等,无论你想叫它。对于解析HTML,我试图加入HTML敏捷包,但它并不像我想象的那么容易。我已经包含了一些规范和图片,说明我到目前为止所做的工作,并希望就如何开展工作获得您的意见。基本上,我想做一些类似于Visual Web Ripper中使用的布局,但我不知道它们是如何做到的......任何想法?使用C#和.NET Framework进行屏幕抓取,网页抓取,网页收集,Web数据提取等工作

图片:

http://img69.imageshack.us/img69/8880/webharvester1.png

http://img198.imageshack.us/img198/9563/webharvester2.png

规格:

我的目标是做一个非常人性化的指向和点击下载数据和图像应用来自网络。我想使用Web浏览器加载HTML页面,并将解析的数据和图像链接输出到文本框中。用户可以指定他们想要的HTML标签,然后将数据下载到网格中。最后,将数据导出为他们需要的任何格式。

我正在尝试使用HTML Agility Pack在网页上加载HTML并将其显示在文本框中。

// Load Web Browser 
    private void Form6_Load(object sender, EventArgs e) 
    { 
     // Navigate to webpage 
     webBrowser.Navigate("http://www.webopedia.com/TERM/H/HTML.html"); 

     // Save URL to memory 
     SiteMemoryArray[count] = urlTextBox.Text; 

     // Load HTML from webBrowser 
     HtmlWindow window = webBrowser.Document.Window; 
     string str = window.Document.Body.OuterHtml; 

     // Extract tags using HtmlAgilityPack and display in textbox 
     HtmlAgilityPack.HtmlDocument HtmlDoc = new HtmlAgilityPack.HtmlDocument(); 
     HtmlDoc.LoadHtml(str); 

     HtmlAgilityPack.HtmlNodeCollection Nodes = HtmlDoc.DocumentNode.SelectNodes("//a"); 

     foreach (HtmlAgilityPack.HtmlNode Node in Nodes) 
     { 
      textBox2.Text += Node.OuterHtml + "\r\n"; 
     } 

    } 

为:HtmlWindow window = webBrowser.Document.Window;

我得到的错误:对象引用不设置到对象的实例。

+0

这些都是非常漂亮的截图。你使用的是什么GUI库? – 2012-02-28 01:22:11

+0

谢谢。它是DotNetBar和eXpressApp框架。有任何想法吗? – John 2012-02-28 03:30:09

+0

TBH,您的问题需要更具体。请参阅http://stackoverflow.com/faq和http://stackoverflow.com/questions/how-to-ask – 2012-02-28 04:19:49

回答

2

我对HTMLAgilityPack不熟悉,但我过去使用的一个组件是SGMLReaderhttp://developer.mindtouch.com/SgmlReader。这个功能就像一个XMLReader的插入式替代品,如果需要的话,它甚至可以将文档转换为XML。您可以将其加载到XMLDocument(或甚至XDocument),然后取决于您如何使用它。

所以我建议使用HTTPWebRequest来获取HTML,然后将HTML加载到这个组件。这样你就不需要走近WebBrowser控件。

+0

谢谢。大多数商业网络扫描软件允许您点击网络浏览器中的元素,然后选择您想要的标签。我有一个困难的时候试图做到这一点... http://img714.imageshack.us/img714/2756/visualwebripper.png – John 2012-02-28 17:29:48

2

对于屏幕抓取,如果您要搜索特定图像/形状,可以使用http://www.emgu.com/wiki/index.php/Main_Page。 可能会派上用场。

你也可以“阅读”使用WinAPI的屏幕这样

private Bitmap Capture(IntPtr hwnd) 
    { 
     return Capture(hwnd, GetClientRectangle()); 
    } 

    private Bitmap Capture(IntPtr hwnd, Rectangle zone) 
    { 
     IntPtr hdcSrc = GetWindowDC(hwnd); 

     IntPtr hdcDest = CreateCompatibleDC(hdcSrc); 

     IntPtr hBitmap = CreateCompatibleBitmap(hdcSrc, zone.Width, zone.Height); 

     IntPtr hOld = SelectObject(hdcDest, hBitmap); 

     BitBlt(hdcDest, 0, 0, zone.Width, zone.Height, hdcSrc, zone.X, zone.Y, SRCCOPY); 


     SelectObject(hdcDest, hOld); 

     DeleteDC(hdcDest); 
     ReleaseDC(hwnd, hdcSrc); 

     Bitmap retBitmap = Bitmap.FromHbitmap(hBitmap); 

     DeleteObject(hBitmap); 
     return retBitmap; 
    } 
+0

任何完整的示例源代码使用.NET C#? – Kiquenet 2012-04-06 12:11:14

1

为了解析HTML文档

using SHDocVw;//Interop.SHDocVw.dll 
using mshtml;//Microsoft.mshtml.dll 
InternetExplorer ie= new InternetExplorer(); 
ie.Navigate("www.example.com"); 
ie.Visible = true; 
Thread.Sleep(5000);//wait until page loads 
mshtml.HTMLDocument doc; 
doc = ie.Document;//gives the HTML document of the Page 

为了得到一个标签

IHTMLElementCollection AnchorColl = body.getElementsByTagName("a");//Html element's tag name 

的所有元素,并解析AnchorColl该标签的所有元素。