使用C#和.NET Framework进行屏幕抓取,网页抓取,网页收集,Web数据提取等工作
我正在使用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;
我得到的错误:对象引用不设置到对象的实例。
您可能没有页面加载时,你引用的浏览器窗口中完成。完成后,您可以让浏览器控件触发navigationcomplete事件。看到这个SO回答一个例子:C# how to wait for a webpage to finish loading before continuing
我会这样做... – John 2012-02-28 17:47:48
我对HTMLAgilityPack
不熟悉,但我过去使用的一个组件是SGMLReader
:http://developer.mindtouch.com/SgmlReader。这个功能就像一个XMLReader
的插入式替代品,如果需要的话,它甚至可以将文档转换为XML。您可以将其加载到XMLDocument
(或甚至XDocument
),然后取决于您如何使用它。
所以我建议使用HTTPWebRequest
来获取HTML,然后将HTML加载到这个组件。这样你就不需要走近WebBrowser
控件。
谢谢。大多数商业网络扫描软件允许您点击网络浏览器中的元素,然后选择您想要的标签。我有一个困难的时候试图做到这一点... http://img714.imageshack.us/img714/2756/visualwebripper.png – John 2012-02-28 17:29:48
对于屏幕抓取,如果您要搜索特定图像/形状,可以使用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;
}
任何完整的示例源代码使用.NET C#? – Kiquenet 2012-04-06 12:11:14
为了解析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该标签的所有元素。
这些都是非常漂亮的截图。你使用的是什么GUI库? – 2012-02-28 01:22:11
谢谢。它是DotNetBar和eXpressApp框架。有任何想法吗? – John 2012-02-28 03:30:09
TBH,您的问题需要更具体。请参阅http://*.com/faq和http://*.com/questions/how-to-ask – 2012-02-28 04:19:49