C#网页爬虫抓取行政区划

最近在做一个项目,需要使用行政区划的,可是在网上搜索了很久,都没有查到有最新的现成的文档。我知道在国家统计局的网站上是有整个国家的行政区划的,但是也是一个网页一个网页的,很难用复制粘贴的方式获取。那我就实现一个抓取网页的功能,从国家统计局的网站上抓取行政区划的数据。
网页的获取是一个很简单的过程,我们定义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("&nbsp;    "))
                    {
                        flag = "3";
                    }
                    else if (code.Contains("&nbsp;   "))
                    {
                        flag = "2";
                    }
                    else if (code.Contains("&nbsp;  "))
                    {
                        flag = "1";
                    }
                    else
                    {
                        flag = string.Empty;
                    }

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

只要使用这两个函数就能获取网页解析网页内容,得到行政区划。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

panliuwen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值