使用C#和.NET Framework進行屏幕抓取,Web抓取,Web收集,Web數據提取等

.net c# html-agility-pack visual-studio web-scraping

我正在使用C#中的Microsoft .NET應用程序進行Web收集,Web Scraping,Web數據提取,屏幕抓取等,無論您想要什麼稱呼它。對於解析HTML,我正在嘗試合併HTML Agility Pack,但它並不像我想像的那麼容易。我已經包含了一些我目前所掌握的規範和圖像,並希望得到你對我如何進行的意見。基本上,我想做一些類似於Visual Web Ripper中使用的佈局,但我不知道他們是如何做到的......任何想法?

圖片:

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

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

產品規格:

我的目標是創建一個非常用戶友好的點擊式應用程序,用於從Web下載數據和圖像。我想使用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;

我收到錯誤:對象引用未設置為對象的實例。

一般承認的答案

在引用瀏覽器窗口時,可能沒有完成頁面加載。您可以讓瀏覽器控件在完成後觸發navigationcomplete事件。請參閱此SO答案以獲取示例: C#如何在繼續之前等待網頁完成加載


熱門答案

對於屏幕抓取,如果要搜索特定的圖像/形狀,可以使用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;
    }



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因