C#网页爬虫抓取行政区划
2015-08-13 08:21
399 查看
最近在做一个项目,需要使用行政区划的,可是在网上搜索了很久,都没有查到有最新的现成的文档。我知道在国家统计局的网站上是有整个国家的行政区划的,但是也是一个网页一个网页的,很难用复制粘贴的方式获取。那我就实现一个抓取网页的功能,从国家统计局的网站上抓取行政区划的数据。 网页的获取是一个很简单的过程,我们定义WebRequest 类来访问网址,然后WebResponse 类来接收响应的数据,然后用StreamReader 来读取流信息就可以了,下面是抓取网页并返回网页内容的函数,代码如下:
/// 获取网页内容 /// </summary> /// <param name="myUrl">网址</param> /// <param name="encoding">编码</param> /// <returns></returns> private string GetRequestInfo(string myUrl, string encoding) { WebRequest request = WebRequest.Create(myUrl); WebResponse response = request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));//gb2312 "utf-8" string htmlContent = reader.ReadToEnd(); System.Threading.Thread.Sleep(1); return htmlContent; }
函数中的encoding是我们要注意的,中文网页有的使用gb2312,有的使用utf-8,我们要根据网页的编码来传参数。
国家最新行政区划的网址为http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201504/t20150415_712722.html,使用ie查看源代码,看到区划代码名称的css类型都是MsoNormal。这个很重要,我们等下在使用HtmlAgilityPack这个dll解析网址的时候,就会用到。HtmlAgilityPack是开源的解析网址内容的利器,专门解析网页的内容,我现在只是使用.net framework 2.0的。
/// <summary> /// 解析 /// </summary> private List<string> AnalyHtmlContentSinglePage(string htmlContent, string trClass) { List<string> list = new List<string>(); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(htmlContent); HtmlAgilityPack.HtmlNodeCollection trList = doc.DocumentNode.SelectNodes(trClass); if (trList != null) { foreach (HtmlAgilityPack.HtmlNode hn in trList) { string code = string.Empty; string name = string.Empty; string flag = string.Empty; code = hn.InnerText; if (code.Contains(" ")) { flag = "3"; } else if (code.Contains(" ")) { flag = "2"; } else if (code.Contains(" ")) { flag = "1"; } else { flag = string.Empty; } code = code.Replace(" ", "\t"); code = code.Replace(" ", "\t"); string[] sa = code.Split(new char[] { '\t' }); code = sa[0]; for (int i = 1; i < sa.Length; i++) { if (string.IsNullOrEmpty(sa[i])) continue; name = sa[i].Trim(); } list.Add(code + "\t" + name); } } return list; }
我将获取的网页内容传给这个函数,类型是MsoNormal。我们只能通过空格来识别行政级别,省空格较少,市级空格比省更长,县或者区的空格最长。这些都是查看网页源码获取的。
只要使用这两个函数就能获取网页解析网页内容,得到行政区划。
相关文章推荐
- 进程与线程、应用程序域关系
- C#脚本引擎 CS-Script 之(三)——如何部署
- c#关键词operator
- C# verload,overwrite,override
- C#如何转换2位数字表示的年
- 编写高质量代码改善C#程序的157个建议——建议15: 使用dynamic来简化反射实现
- c#学习之双冒泡运算符
- 编写高质量代码改善C#程序的157个建议——建议14: 正确实现浅拷贝和深拷贝
- C#学习之Foreach
- C# ISupportInitialize的使用
- C#中out和ref之间的区别
- 编写高质量代码改善C#程序的157个建议——建议13: 为类型输出格式化字符串
- 编写高质量代码改善C#程序的157个建议——建议12: 重写Equals时也要重写GetHashCode
- C#笔记(一)
- 编写高质量代码改善C#程序的157个建议——建议11: 区别对待==和Equals
- 编写高质量代码改善C#程序的157个建议——建议10: 创建对象时需要考虑是否实现比较器
- C# winform 实现MD5加密功能
- C# 控制台程序Console.ReadKey的用法
- C#学习之For循环
- C#学习之While循环