繁体   English   中英

使用 C# 和 .NET Framework 进行屏幕抓取、网页抓取、网页收集、网页数据提取等

[英]Screen Scraping, Web Scraping, Web Harvesting, Web Data Extraction, etc. using C# and the .NET Framework

我正在使用Microsoft .NET Application in C#开发Microsoft .NET Application in C#用于 Web 收集、Web 抓取、Web 数据提取、屏幕抓取等。无论您想怎么称呼它。 为了解析HTML ,我正在尝试合并 HTML Agility Pack ,但这并不像我想象的那么容易。 我已经包含了到目前为止我所拥有的一些规格和图像,并希望得到您对我如何进行的意见。 基本上,我想做一些类似于 Visual Web Ripper 中使用的布局的事情,但我不知道他们是如何做到的……有什么想法吗?

规格:

我的目标是制作一个非常用户友好的点击式应用​​程序,用于从网络下载数据和图像。 我想使用网络浏览器加载 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;

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

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

我不熟悉HTMLAgilityPack但我过去使用过的一个组件是SGMLReaderhttp : //developer.mindtouch.com/SgmlReader 它的功能类似于XMLReader替代品,如果需要,甚至可以为您将文档转换为 XML。 您可以将其加载到XMLDocument (甚至是XDocument )中,然后由您决定如何处理它。

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

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

埃姆古

您还read使用WinAPI read屏幕,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM