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

借鉴C#网页爬虫抓取行政区划,从国家统计局获取了最新行政区域数据。

以下为代码贴片:

数据库类:

public class City {
    public decimal ID { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string Org_Level { get; set; }
    public string ParentCode { get; set; }
    public decimal ParentID { get; set; }
    public string Contry { get; set; }
    public string Loc_x { get; set; }
    public string Loc_y { get; set; }
  }

获取网页帮助类:

 1  public class HttpHelper {
 2     private static ILog log = log4net.LogManager.GetLogger(typeof(HttpHelper));
 3
 4     public static string DownloadHtml(string url,Encoding encod) {
 5       string html = string.Empty;
 6       try {
 7         //设置请求参数
 8         HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
 9         request.Timeout = 10 * 1000;//10s超时
10         request.ContentType = "text/html;charset=utf-8";
11         request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36";
12
13         //获取结果
14         using(HttpWebResponse resp = request.GetResponse() as HttpWebResponse) {
15           if(resp.StatusCode != HttpStatusCode.OK) {
16             log.Fatal(string.Format("抓取{0}地址返回失败,response.StatusCode = {1}",url,resp.StatusCode));
17           } else {
18             try {
19               StreamReader sr = new StreamReader(resp.GetResponseStream(),encod);
20               html = sr.ReadToEnd();
21               sr.Close();
22             } catch(Exception e) {
23               log.Fatal(string.Format("DownLoadHtml抓取html{0}保存失败",url),e);
24
25             }
26           }
27         }
28       } catch(Exception e) {
29         if(e.Message.Equals("远程服务器返回错误:(306)。")) {
30         }
31         log.Fatal(e);
32       } finally {
33       }
34       return html;
35     }
36   }

数据库保存帮助类:

  public class SQLHelper {

    /// 一个有效的数据库连接对象
    /// 命令类型(存储过程,命令文本或其它.)
    /// T存储过程名称或T-SQL语句
    /// SqlParamter参数数组
    /// 返回影响的行数
    public static int ExecuteNonQueryForCity(List<City> cityList) {
      int count = 0;
      //string dbConnectStr = System.Configuration.ConfigurationSettings.AppSettings["DBContext"].ToString();
      var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["DBContext"].ConnectionString;
      using(SqlConnection connection = new SqlConnection(connectionString)) {
        if(connection.State != ConnectionState.Open) {
          connection.Open();
        }
        // 创建SqlCommand命令,并进行预处理
        using(SqlCommand cmd = new SqlCommand()) {
          cmd.Connection = connection;
          cmd.CommandText = "insert into base_city(ID,name,Code,Contry,Loc_x,Loc_y,Org_Level,ParentCode,ParentID,state) values(@ID,@name,@Code,@Contry,@Loc_x,@Loc_y,@Org_Level,@ParentCode,@ParentID,@state)";
          foreach(var city in cityList) {
            try {
              if(string.IsNullOrEmpty(city.Name))
                city.Name = "";
              if(string.IsNullOrEmpty(city.Code))
                city.Code = "";
              if(string.IsNullOrEmpty(city.Contry))
                city.Contry = "";
              if(string.IsNullOrEmpty(city.Loc_x))
                city.Loc_x = "";
              if(string.IsNullOrEmpty(city.Loc_y))
                city.Loc_y = "";
              if(string.IsNullOrEmpty(city.Org_Level))
                city.Org_Level = "";
              if(string.IsNullOrEmpty(city.ParentCode))
                city.ParentCode = "";

              cmd.Parameters.Add(new SqlParameter("@ID",city.ID));
              cmd.Parameters.Add(new SqlParameter("@name",city.Name));
              cmd.Parameters.Add(new SqlParameter("@Code",city.Code));
              cmd.Parameters.Add(new SqlParameter("@Contry",city.Contry));
              cmd.Parameters.Add(new SqlParameter("@Loc_x",city.Loc_x));
              cmd.Parameters.Add(new SqlParameter("@Loc_y",city.Loc_y));
              cmd.Parameters.Add(new SqlParameter("@Org_Level",city.Org_Level));
              cmd.Parameters.Add(new SqlParameter("@ParentCode",city.ParentCode));
              cmd.Parameters.Add(new SqlParameter("@ParentID",city.ParentID));
              cmd.Parameters.Add(new SqlParameter("@state","1"));
              // Finally, execute the command
              int retval = cmd.ExecuteNonQuery();
              if(retval == 0) {
                Console.WriteLine("插入错误:");
              }
              count += retval;
            } catch(Exception e) {
              Console.WriteLine("插入错误:" + e.Message);
            }
            // 清除参数,以便再次使用.
            cmd.Parameters.Clear();
          }
        }
        connection.Close();
      }
      return count;
    }
  }

抓取数据:

 public class 省市县数据抓取 {
    private ILog log = log4net.LogManager.GetLogger(typeof(省市县数据抓取));
    public const string UrlStr = "http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201703/t20170310_1471429.html";
    public List<City> SaveList = new List<City>();
    public 省市县数据抓取() {
      try {
        log.Info("抓取数据");
        string HtmlStr = HttpHelper.DownloadHtml(UrlStr,Encoding.UTF8);
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(HtmlStr);
        //string goodsListPath = "//*[@id=‘J_goodsList‘]";
        //HtmlNode goodsListNode = doc.DocumentNode.SelectSingleNode(goodsListPath);
        string liPath = "//p[@class=‘MsoNormal‘]";
        HtmlNodeCollection goodsNodeCollection = doc.DocumentNode.SelectNodes(liPath);

        City c = new City() {
          ID=1,
          Name = "全国",
          Code = "100000",
          Contry = "China",
          Org_Level = "1"
        };
        SaveList.Add(c);
        foreach(var item in goodsNodeCollection) {
          var firstNode = item.FirstChild;
          if(firstNode.Name == "b")
            GetProvince(item);
          else if(firstNode.InnerText == " ") {
            GetCity(item);
          } else if(firstNode.InnerText == "  ") {
            GetCounty(item);
          }
        }

      } catch(Exception e) {
        log.Info("last child code:" + SaveList.Last().Code);
        log.Info(e);
        throw (e);
      }
    }

    private void GetCounty(HtmlNode item) {
      City c = new City();
      c.Code = item.ChildNodes[1].InnerText.Replace(" ","").Trim();
      c.Name = item.ChildNodes[2].InnerText.Trim();
      c.Org_Level = "4";
      c.ID = SaveList.Last().ID + 1;
      var pc = SaveList.Last(i => i.Org_Level == "3");
      c.ParentCode = pc.Code;
      c.ParentID = pc.ID;
      c.Contry = "China";
      //if(c.Name == "市辖区")
      //  return;
      SaveList.Add(c);
    }

    private void GetCity(HtmlNode item) {
      City c = new City();
      c.Code = item.ChildNodes[1].InnerText.Replace(" ","").Trim();
      c.Name = item.ChildNodes[2].InnerText.Trim();
      c.Org_Level = "3";
      c.ID = SaveList.Last().ID + 1;
      var pc = SaveList.Last(i => i.Org_Level == "2");
      c.ParentCode = pc.Code;
      c.ParentID = pc.ID;
      c.Contry = "China";
      SaveList.Add(c);

    }

    private void GetProvince(HtmlNode item) {
      City c = new City();
      c.Code = item.ChildNodes[0].FirstChild.InnerText.Replace(" ","").Trim();
      c.Name = item.ChildNodes[1].FirstChild.InnerText.Trim();
      c.Org_Level = "2";
      c.ID = SaveList.Last().ID + 1;
      var pc = SaveList.Last(i => i.Org_Level == "1");
      c.ParentCode = pc.Code;
      c.ParentID = pc.ID;
      c.Contry = "China";
      SaveList.Add(c);
    }

    public void Save() {
      log.Info("保存数据");
      SQLHelper.ExecuteNonQueryForCity(SaveList);
    }
  }

全国 Org_Level =1

省 Org_Level =2

市 Org_Level =3

县 Org_Level =4

SaveList 首先添加了一个全国属性城市,Org_Level =1

因为网页数据读取是从  省->市->县  ->省->市->县  这样循环读取的,所以在获取省、市、县的父级时,可以直接从SaveList 获取最后一个上一级别的对象即可

执行类:

省市县数据抓取 CityCatch = new 省市县数据抓取();
CityCatch.Save();

获取的数据如下:

时间: 2024-10-17 15:33:47

C#网页爬虫抓取行政区划的相关文章

Python3简单爬虫抓取网页图片

现在网上有很多python2写的爬虫抓取网页图片的实例,但不适用新手(新手都使用python3环境,不兼容python2),所以我用Python3的语法写了一个简单抓取网页图片的实例,希望能够帮助到大家,并希望大家批评指正. 1 import urllib.request 2 import re 3 import os 4 import urllib 5 #根据给定的网址来获取网页详细信息,得到的html就是网页的源代码 6 def getHtml(url): 7 page = urllib.r

Python爬虫抓取网页图片

本文通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地. 下面就看看如何使用python来实现这样一个功能. # -*- coding: utf-8 -*- import urllib import re import time import os #显示下载进度 def schedule(a,b,c): ''''' a:已经下载的数据块 b:数据块的大小 c:远程文件的大小 ''' per = 100.0 * a * b / c if per > 100 : per =

爬虫抓取网页相似度判断

爬虫抓取网页过程中,会产生很多的问题,当然最重要的一个问题就是重复问题,网页的重复抓取.最简单的方式就是对url去重.已经抓取过的url不再抓取.但是其实在实际业务中是需要对于已经抓取过的URL进行再次抓取的.例如 BBS .bbs存在大量的更新回复,但是url不会发生改变. 一般情况下的url去重方式,就是判断url是否抓取过,如果抓取过就不再抓取,或者是在一定时间内不再抓取.. 我的需求也是这样的, 所以首先做的就是url去重. 在爬虫发现链接,加入待抓取队列的时候,会对url进行验证,是否

爬虫---selenium动态网页数据抓取

动态网页数据抓取 什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面.因为传统的在传输数据格式方面,使用的是XML语法.因此叫做AJAX,其实现在数据交互基本上都是使用JSON.使用AJAX加载的数据,即使使用了JS,将数

第四章爬虫进阶之动态网页数据抓取

动态网页数据抓取 什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面.因为传统的在传输数据格式方面,使用的是XML语法.因此叫做AJAX,其实现在数据交互基本上都是使用JSON.使用AJAX加载的数据,即使使用了JS,将数

python 爬虫抓取心得

quanwei9958 转自 python 爬虫抓取心得分享 urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quote('要编码的字符串') query = urllib.quote(singername) url = 'http://music.baidu.com/search?key='+query response = urllib.urlopen(url) text = response.read()

爬虫技术(四)-- 简单爬虫抓取示例(附c#代码)

这是我的第一个爬虫代码...算是一份测试版的代码.大牛大神别喷... 通过给定一个初始的地址startPiont然后对网页进行捕捉,然后通过正则表达式对网址进行匹配. List<string> todo :进行抓取的网址的集合 List<string> visited :已经访问过的网址的集合 下面实现的是,给定一个初始地址,然后进行爬虫,输出正在访问的网址和已经访问的网页的个数. 需要注意的是,下面代码实现的链接匹配页面的内容如图一.图二所示: 图一: 图二: 简单代码示范如下:

nodejs爬虫抓取数据 -- html 实体编码处理办法

cheerio DOM化并解析的时候 1.假如使用了 .text()方法,则一般不会有html实体编码的问题出现 2.如果使用了 .html()方法,则很多情况下都会出现,这时,可能就需要转义一番了 类似这些 因为需要作数据存储,所有需要转换 Халк крушит. Новый способ исполнен 大多数都是&#(x)?\w+的格式 所以就用正则转换一番 var body = ....//这里就是请求后获得的返回数据,或者那些 .html()后获取的 //一般可以先转换为标准uni

php爬虫抓取信息及反爬虫相关

58爬虫了百姓,赶集和58互爬,最后各种信息相同,都是爬虫后的数据库调用,潜规则啊,几家独大还暗中各种攻击,赶驴网的幽默事例我不想多评价.这个时代是砸.钱*养.钱的时代,各种姚晨杨幂葛优,各种地铁公车广告,各种卫视广告,铺天盖地~~~ 来谈php爬虫抓取信息~~ php爬虫首推Curl函数了,先来认识下它. 0x01.curl扩展的安装: 1.确保php子文件夹ext里面有php_curl.dll(一般都有的,一般配置时候会设置环境变量的) 2.将php.ini里面的;extension=php