2012-02-28 146 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該標籤的所有元素。