C# 数据抓取

实现效果

抓取行政区划代码
地址:http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/index.html

解决思路

分析页面数据规则,模拟请求获取页面内容,正则过滤,数据入库,递归

代码示例

建表、添加、删除

    public void CreateDB(string tableName)
    {
        string strSql = "IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo." + tableName
            + "') AND type in (N'U')) DROP TABLE dbo." + tableName;
        string strC = " CREATE TABLE dbo." + tableName + "([id] [varchar](50) NULL,[type] [varchar](50) NULL,[name] [nvarchar](50) NULL,[pid] [varchar](50) NULL,[url] [varchar](100) NULL) ON [PRIMARY]";
        SQLHelper sqlh = new SQLHelper();
        sqlh.ExecuteSQLNonQuery(strSql);
        sqlh.ExecuteSQLNonQuery(strC);
    }

    public void InsertDB(Region r, string tableName)
    {
        string strSql = "INSERT INTO " + tableName + " ([id],[type],[name],[pid],[url]) VALUES('" + r.id
            + "','" + r.type + "','" + r.name + "','" + r.pid + "','" + r.url + "')";
        SQLHelper sqlh = new SQLHelper();
        sqlh.ExecuteSQLNonQuery(strSql);
    }

    public void DeleteDB()
    {
        string strSql = "delete from  [GetRegion] ";
        SQLHelper sqlh = new SQLHelper();
        sqlh.ExecuteSQLNonQuery(strSql);

    }

数据抓取

    /// <summary>
    /// 模拟请求返回数据
    /// </summary>
    /// <param name="strUrl">网页地址</param>
    /// <param name="strType">POST、GET</param>
    /// <param name="strEncoding">UTF-8、gb2312</param>
    /// <returns>网页内容</returns>
    public string Send(string strUrl, string strType, string strEncoding)
    {
        HttpWebRequest httpReq = (HttpWebRequest)HttpWebRequest.Create(strUrl); ////创建request请求
        if (httpReq == null)
        {
            throw new ApplicationException(string.Format("Invalid url string: {0}", strUrl));
        }
        httpReq.Method = strType;
        httpReq.Timeout = 1000 * 30;
        //设置请求方式
        HttpWebResponse httpRes = (HttpWebResponse)httpReq.GetResponse();                       ////返回response数据
        Stream myRequestStream = httpRes.GetResponseStream();                                   ////取得内容
        StreamReader myStreamRead = new StreamReader(myRequestStream, Encoding.GetEncoding(strEncoding));        ////读取流

        string strdata = string.Empty;
        strdata = myStreamRead.ReadToEnd();

        myStreamRead.Close();
        myRequestStream.Close();
        return strdata;

    }

递归

    public void GetRegion(string strUrl, string strPid, string tableName)
    {
        string strHtml = Send(strUrl, "GET", "gb2312");
        string strTable = AnalyzeHtml(strHtml);

        //街道
        if (strHtml.Contains("villagetable"))
        {

            Regex reg = new Regex(@"<td>(?<value>.*?)</td>");
            MatchCollection mc = reg.Matches(strTable);

            for (int i = 0; i < (mc.Count - 1) / 3; i++)
            {
                Region r = new Region();
                r.id = mc[i * 3 + 1].ToString().Replace("<td>", "").Replace("</td>", "");
                r.type = mc[i * 3 + 2].ToString().Replace("<td>", "").Replace("</td>", "");
                r.pid = strPid;
                r.name = mc[i * 3 + 3].ToString().Replace("<td>", "").Replace("</td>", "");
                //listR.Add(r);
                InsertDB(r, tableName);
            }

        }
        else
        {
            Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>");
            MatchCollection mc = reg.Matches(strTable);
            //省、直辖市
            if (strHtml.Contains("provincetable"))
            {
                for (int i = 0; i < mc.Count; i++)
                {
                    Region r = new Region();
                    r.id = "00" + (i + 1).ToString();
                    r.type = "";
                    r.pid = strPid;
                    r.name = mc[i].Groups["text"].Value.Replace("<br/>", "");
                    r.url = strUrl.Remove(strUrl.LastIndexOf("/") + 1, strUrl.Length - strUrl.LastIndexOf("/") - 1)
                        + mc[i].Groups["url"].Value;
                    //listR.Add(r);
                    InsertDB(r, tableName);
                    GetRegion(r.url, r.id, tableName);
                }
            }
            else
            {
                for (int i = 0; i < mc.Count / 2; i++)
                {
                    Region r = new Region();
                    r.id = mc[i * 2].Groups["text"].Value.Replace("<br/>", "");
                    r.type = "";
                    r.pid = strPid;
                    r.name = mc[i * 2 + 1].Groups["text"].Value.Replace("<br/>", "");
                    r.url = strUrl.Remove(strUrl.LastIndexOf("/") + 1, strUrl.Length - strUrl.LastIndexOf("/") - 1)
                        + mc[i * 2].Groups["url"].Value;
                    //listR.Add(r);
                    InsertDB(r, tableName);
                    GetRegion(r.url, r.id, tableName);
                }
            }
        }
    }

遇到问题及解决思路

数据量大

数据分省份保存入库,提供多种处理方式,数据量少入库同时导出,数据量大先入库,再分多工作薄导出。如无法导出,使用直接拷贝粘贴,或者使用数据库标准导出。

检查完整性

自动检查,加上手工抽查,记录获取数据条目,对比数据库记录数。检查省份最后乡镇街道数据,随机抽查省份数据。

操作界面

操作界面
操作界面
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容