//使用webbrowser访问指定网页。address为网页地址
private void Navigate(WebBrowser web,String address) { if (String.IsNullOrEmpty(address)) return; if (address.Equals("about:blank")) return; if (!address.StartsWith("http://")) address = "http://" + address; try { web.Navigate(new Uri(address)); } catch (System.UriFormatException) { return; }
}
由于要抓取网页内容及在加载完毕后提交参数所以需要验证加载完毕即DocumentCompleted。而在实际使用过程当中,发现在一个页面的加载过程中可能会有多次DocumentCompleted,所以在这里采用+1、-1的方式来判断是否加载完毕。
首先在formload中绑定网页加载完毕事件。
并且定义标示count
然后在每次导航后给标示+1
在每次DocumentCompleted中给count-1,最后当count=0时即表示页面加载完毕。可以进行对页面信息的处理等操作了。
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { count = count - 1; string eventTarget = "dg_Code$ctl24$ctl"; if (0 == count && isComplete == false && j<=10) { eventTarget = eventTarget + getPage(j); if (!isLastPage(webBrowser1)) { InvokeScriptMethod(webBrowser1, eventTarget, ""); } else { MessageBox.Show("抓取完毕"); } postComplete = true; j++; } else if (postComplete == true) { dealWithByDOM(webBrowser1); postComplete = false; } else if (0 == count && isComplete) { System.Windows.Forms.HtmlDocument htdoc = webBrowser1.Document; for (int i = 0; i < htdoc.All.Count; i++) { if (htdoc.All[i].Name == "btn_search") { htdoc.All[i].InvokeMember("click");//引发”CLICK”事件 isComplete = false; break; } } } }
剩下的就是对html的分析,如何在茫茫多的html代码中找到我们需要的信息呢?在这里我是通过HtmlAgilityPack类来处理html内容提取的。
其中HtimlAgilityPack类是codeplex上的提供的一个类,下载地址http://htmlagilitypack.codeplex.com/用来处理html文件还是非常不错的(个人感觉挺好用)
以上就是该程序的部分实现代码。最后效果图如下:(不过不到万不得已最好不要使用webbrowser的方式做爬虫,它的速度太慢了,我要抓取的信息只有286页,可是花了我将近10分钟的时间)
下面是程序运行效果图:(为了展示方便,左边为webBrowser控件导航到目标网站的结果,右边dataGridview为抓取后经过提取的所需信息。)
下载说明
☉本站所有源码和资源均由站长亲自测试-绝对保证都可以架设,运营!
☉如源码和资源有损坏或所有链接均不能下载,请告知管理员,
☉本站软件和源码大部分为站长独资,资源购买和收集,放心下载!
☉唯一站长QQ:1004003180 [人格担保-本站注重诚信!]
☉购买建议E-mail:1004003180@qq.com 源码收购 E-mail:1004003180@qq.com
☉本站文件解压密码 【文章内都自带解压密码,每个密码不同!】