c#关于网页内容抓取,简单爬虫的实现。(包括动态,静态的)
2012-02-29 14:23
2291 查看
整理一下最近做的几个项目。总结几个用到的知识点和关键部分代码,以供大家学习交流。
1、爬虫抓取网页内容信息。可以用System.Net.WebRequest、webclient等类来处理。
2、对于某些动态网页,生成页面信心由javascript动态生成链接信息的。也可以进行分析传值的方式,在post的时候将参数带进去(大多数网站的参数是有规则的)。实在不行也可以使用webbrowser控件,模拟点击。或传值。
以http://www.aslan.com.cn/Code.aspx网站为例。
部分代码如下:
//使用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
在每次DocumentCompleted中给count-1,最后当count=0时即表示页面加载完毕。可以进行对页面信息的处理等操作了。
剩下的就是对html的分析,如何在茫茫多的html代码中找到我们需要的信息呢?在这里我是通过HtmlAgilityPack类来处理html内容提取的。
其中HtimlAgilityPack类是codeplex上的提供的一个类,下载地址http://htmlagilitypack.codeplex.com/用来处理html文件还是非常不错的(个人感觉挺好用)
以上就是该程序的部分实现代码。最后效果图如下:(不过不到万不得已最好不要使用webbrowser的方式做爬虫,它的速度太慢了,我要抓取的信息只有286页,可是花了我将近10分钟的时间)
下面是程序运行效果图:(为了展示方便,左边为webBrowser控件导航到目标网站的结果,右边dataGridview为抓取后经过提取的所需信息。)
1、爬虫抓取网页内容信息。可以用System.Net.WebRequest、webclient等类来处理。
2、对于某些动态网页,生成页面信心由javascript动态生成链接信息的。也可以进行分析传值的方式,在post的时候将参数带进去(大多数网站的参数是有规则的)。实在不行也可以使用webbrowser控件,模拟点击。或传值。
以http://www.aslan.com.cn/Code.aspx网站为例。
部分代码如下:
//使用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中绑定网页加载完毕事件。
private void getCode3webBrowser_Load(object sender, EventArgs e) { string address = "http://www.aslan.com.cn/Code.aspx"; this.Navigate(webBrowser1, address); webBrowser1.Navigated += new WebBrowserNavigatedEventHandler(webBrowser_Navigated); webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted); }
并且定义标示count
int count = 0;然后在每次导航后给标示+1
private void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e) { count++; }
在每次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文件还是非常不错的(个人感觉挺好用)
private void dealWithByDOM(WebBrowser webBro) { HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.LoadHtml(webBro.DocumentText); HtmlNode Node1 = htmlDoc.GetElementbyId("dg_Code_ctl03_Label5"); HtmlNode Node2 = htmlDoc.GetElementbyId("dg_Code_ctl03_Label6"); HtmlNode Node3 = htmlDoc.GetElementbyId("dg_Code_ctl03_Label7"); HtmlNode Node4 = htmlDoc.GetElementbyId("dg_Code_ctl03_Label8"); HtmlNode Node5 = htmlDoc.GetElementbyId("dg_Code_ctl03_Label9"); DataRow dr = dt_finallyResult.NewRow(); dr["三字码"] = Node1.InnerText; dr["城市码"] = Node2.InnerText; dr["城市中文名"] = Node3.InnerText; dr["城市英文名"] = Node4.InnerText; dr["国家"] = Node5.InnerText; dt_finallyResult.Rows.Add(dr); dataGridView1.DataSource = dt_finallyResult; }
以上就是该程序的部分实现代码。最后效果图如下:(不过不到万不得已最好不要使用webbrowser的方式做爬虫,它的速度太慢了,我要抓取的信息只有286页,可是花了我将近10分钟的时间)
下面是程序运行效果图:(为了展示方便,左边为webBrowser控件导航到目标网站的结果,右边dataGridview为抓取后经过提取的所需信息。)
相关文章推荐
- c#关于网页内容抓取,简单爬虫的实现。(包括动态,静态的)
- c#关于网页内容抓取,简单爬虫的实现。(包括动态,静态的)
- c#关于网页内容抓取,简单爬虫的实现。(包括动态,静态的)
- 如何用Python,C#等语言去实现抓取静态网页+抓取动态网页+模拟登陆网站
- Python分布式爬虫前菜(1):关于静态动态网页内容获取的N种方法
- 如何用Python,C#等语言去实现抓取静态网页+抓取动态网页+模拟登陆网站
- 如何用Python,C#等语言去实现抓取静态网页+抓取动态网页+模拟登陆网站
- 网页爬虫抓取URL简单实现
- Python 实现网络爬虫 抓取静态网页【代码】
- Python入门简单的静态网页爬虫2.0 (实现各模块的具体方法)
- C#实现简单的网页爬虫
- C# 使用 Abot 实现 爬虫 抓取网页信息 源码下载
- C# 实现抓取网页内容(一)
- C#实现网页内容正文抓取
- 萌新的Python学习日记 - 爬虫无影 - 添加headers抓取动态网页内容:TripAdvisor(上)
- c#简单实现提取网页内容
- 萌新的Python学习日记 - 爬虫无影 - 使用BeautifulSoup + css selector 抓取动态网页内容:Knewone
- 利用python抓取网页各种类型内容(静态、动态)
- 详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)
- Python3学习(34)--简单网页内容抓取(爬虫入门一)