使用C#和.NET框架进行屏幕抓取、Web抓取、Web收获、Web数据提取等

本文关键字:Web 抓取 收获 数据 提取 屏幕 NET 框架 使用 | 更新日期: 2023-09-27 18:26:03

我正在开发一个Microsoft .NET Application in C#,用于Web Harvesting、Web Scratching、Web Data Extraction、Screen Scratch等。无论你想怎么称呼它。为了解析HTML,我正在尝试合并HTML Agility Pack,但它并不像我想象的那么容易。我已经包含了一些规范和图像,介绍了到目前为止我所拥有的内容,希望能得到你对我如何继续操作的意见。基本上,我想做一些类似于Visual Web Ripper中使用的布局,但我不知道他们是如何做到的…有什么想法吗?

规格:

我的目标是制作一个非常用户友好的点击式应用程序,用于从网络下载数据和图像。我想使用web浏览器加载HTML页面,并将解析后的数据和图像链接输出到文本框中。用户可以指定他们想要的HTML标签,然后将数据下载到网格中。最后,将数据导出为所需的任何格式。

我正在尝试使用HTML敏捷包在网页上加载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;

我得到错误:Object reference not set to an instance of an object

使用C#和.NET框架进行屏幕抓取、Web抓取、Web收获、Web数据提取等

当您引用浏览器窗口时,可能没有完成页面加载。完成后,您可以让浏览器控件激发navigationcomplete事件。请参阅下面的SO答案以获取示例:C#如何在继续之前等待网页完成加载

我不熟悉HTMLAgilityPack,但我过去使用过的一个组件是SGMLReader:http://developer.mindtouch.com/SgmlReader.这就像是XMLReader的插件,如果您愿意,甚至可以将文档转换为XML。您可以将其加载到XMLDocument(甚至XDocument)中,然后由您决定如何使用它。

因此,我建议使用HTTPWebRequest来获取HTML,然后将HTML加载到此组件中。这样,您就不需要接近WebBrowser控件。

对于屏幕抓取,如果您正在搜索特定的图像/形状,您可以使用:

EMGU

您也可以使用WinAPIread屏幕,例如:

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;
}

解析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.

获取标签的所有元素:

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

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