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

我正在使用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#如何在继续之前等待网页完成加载

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

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

对于屏幕抓取,如果要搜索特定的图像/形状,可以使用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; } 

解析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以获取该标记的所有元素。