c#关于网页内容抓取,简单爬虫的实现。包括动态,静态的
整理一下最近做的几个项目。总结几个用到的知识点和关键部分代码,以供大家学习交流。
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#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
- 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测
- C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】
- c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)
- 请求大神,C#如何截取字符串中指定字符之间的部分 按指定字符串分割 一分为二 c# 去除字符串中的某个已知字符
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- C# IL DASM 使用-破解c#软件方法
- 【卷土重来之C#学习笔记】(二)c#编程概述
- c#静态构造函数 与 构造函数 你是否还记得?
- Word控件Spire.Doc 【书签】教程(8):用 C#、VB.NET 中的 Word 文档中的表格替换书签
- C#中生成的随机数为什么不随机?
- C# mongodb中内嵌文档数组条件查询
- 用C#调用C++DLL(x64),总是提示找不到DLL
- C#【必备技能篇】字节数组转16进制字符串,用空格分隔
- C#,图像二值化(19)——全局阈值的香巴拉算法( Shanbhag Thresholding)及源程序
- C#,弗洛伊德-瑞文斯特(Floyd-Rivest)算法与源代码
- C#,汉字转拼音的算法与源代码
- 《C#多线程编程实战(原书第2版)》——3.4 线程池与并行度
- C#-利用Marshal类实现序列化
- c# 属性成员
- c# 静态构造函数
- c# 静态变量
- C# 静态构造函数
- C#-类和结构(C# 编程指南)
- C#多线程和异步(二)——Task和async/await详解
- C# SocketHelper 源码
- C#定义属性-静态属性
- c#类的定义,c#中的关健字,C#标识符