您的位置:首页 > 编程语言 > C#

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。我们只能通过空格来识别行政级别,省空格较少,市级空格比省更长,县或者区的空格最长。这些都是查看网页源码获取的。

只要使用这两个函数就能获取网页解析网页内容,得到行政区划。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: