使用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
。
当您引用浏览器窗口时,可能没有完成页面加载。完成后,您可以让浏览器控件激发navigationcomplete事件。请参阅下面的SO答案以获取示例:C#如何在继续之前等待网页完成加载
我不熟悉HTMLAgilityPack
,但我过去使用过的一个组件是SGMLReader
:http://developer.mindtouch.com/SgmlReader.这就像是XMLReader
的插件,如果您愿意,甚至可以将文档转换为XML。您可以将其加载到XMLDocument
(甚至XDocument
)中,然后由您决定如何使用它。
因此,我建议使用HTTPWebRequest
来获取HTML,然后将HTML加载到此组件中。这样,您就不需要接近WebBrowser
控件。
对于屏幕抓取,如果您正在搜索特定的图像/形状,您可以使用:
EMGU
您也可以使用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
。