国标地址采集

因为工作需要,需要对京东地址和国标地址转换,特意采集了一下最新的国标地址库,以方便进行数据映射。

因为前端技术不太好,只能一点一点的页面分析(大神勿笑),故整理出来,一是为了存储方便以后再用,二是为了一样的方便同样需要这部分数据的小伙伴。

  /// <summary>
    /// 国标地址库采集
    ///
    /// 作者:南丘伟
    /// 时间:2017-06-21
    /// 版本:V1.0.0
    /// 版本说明:
    /// 下次采集时很有可能因为页面格式变化导致采集不到
    /// 此方法可作为下次采集的Demo,采集时另做调整
    ///
    /// </summary>
    public class GbAddressHelper
    {
        public GbAddressHelper() { }

        /// <summary>
        /// 国家统计局地址信息采集
        /// 地址:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201703/t20170310_1471429.html
        /// 调试结果:
        /// [{省,市,区县}]
        ///
        /// </summary>
        /// <param name="gbUrl"></param>
        /// <returns></returns>
        public string DownLoadGbAddress(string gbUrl)
        {
            string newjson = string.Empty;
            string html = HttpUtilitys.SendHttpRequest(gbUrl, "");
            if (html.Contains("xilan_con"))
            {
                //第一步:从页面上获取地址数据相关块
                string regEx = "<div class=\"xilan_con\"([\\w\\W]+)</span></b></p></div>";//获取当前页面
                MatchCollection mcPageIndex = Regex.Matches(html, regEx, RegexOptions.IgnoreCase | RegexOptions.Multiline);
                if (mcPageIndex.Count == 1)
                {
                    html = mcPageIndex[0].Groups[0].Value.Trim();

                    var sb = new StringBuilder();
                    newjson += "[";
                    //第二步:页面地址数据字符串,根据省份切割
                    var prohtmlArry = Regex.Split(html, "<p class=\"MsoNormal\"><span lang=\"EN-US\">", RegexOptions.IgnoreCase);
                    foreach (var item in prohtmlArry)
                    {
                        var prolist = Regex.Split(item, "<p class=\"MsoNormal\"><b><span lang=\"EN-US\">", RegexOptions.IgnoreCase);
                        for (int i = 0; i < prolist.Length; i++)
                        {
                            string newhtml = "<p class=\"MsoNormal\"><b><span lang=\"EN-US\">" + prolist[i];

                            regEx = "<p class=\"MsoNormal\"><b><span lang=\"EN-US\">([\\d]+)<span>";//获取当前页面
                            MatchCollection mcproId = Regex.Matches(newhtml, regEx, RegexOptions.IgnoreCase | RegexOptions.Multiline);
                            if (mcproId.Count > 0)
                            {
                                int proId = Utils.ObjToInt(mcproId[0].Groups[1].Value.Trim(), 0);
                                if (proId > 0)
                                {

                                    //
                                    regEx = "<b><span style=\"font-family: 宋体\">([\u4e00-\u9fa5]+)</span></b></p>";//获取当前页面

                                    // regEx = "</span></span></b><b><span style=\"font-family: 宋体\">([\\w\\W]+)</span></b></p>";//获取当前页面
                                    MatchCollection mcproName = Regex.Matches(newhtml, regEx, RegexOptions.IgnoreCase | RegexOptions.Multiline);
                                    if (mcproName.Count > 0)
                                    {
                                        string proName = mcproName[0].Groups[1].Value.Trim();

                                        newjson += "{";
                                        newjson += "\"PId\":\"0\",";
                                        newjson += "\"AreaId\":\"" + proId + "\",";
                                        newjson += "\"AreaName\":\"" + proName + "\"},";

                                        //第三步:根据省数据,分割城市
                                        //匹配城市
                                        //"<span lang=\"EN-US\">([\\d]+)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(\\s*)</span></span><span style=\"font-family: 宋体\">(\\s*)([\u4e00-\u9fa5]+)</span></p>"

                                        var citylist = Regex.Split(newhtml, "<p class=\"MsoNormal\"><span style=\"font-family: 宋体\"> </span>", RegexOptions.IgnoreCase);
                                        for (int k = 0; k < citylist.Length; k++)
                                        {
                                            int cityId = 0;
                                            //拆分出来的每个城市详情
                                            newhtml = citylist[k];
                                            regEx = "<span lang=\"EN-US\">([\\d]+)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(\\s*)</span></span><span style=\"font-family: 宋体\">(\\s*)([\u4e00-\u9fa5]+)</span></p>";
                                            //拆分城市ID和名称
                                            MatchCollection cityslist = Regex.Matches(newhtml, regEx, RegexOptions.IgnoreCase | RegexOptions.Multiline);
                                            if (cityslist.Count > 0)
                                            {
                                                cityId = Utils.ObjToInt(cityslist[0].Groups[1].Value.Trim(), 0);
                                                newjson += "{";
                                                newjson += "\"PId\":\"" + proId + "\",";
                                                newjson += "\"AreaId\":\"" + cityId + "\",";
                                                newjson += "\"AreaName\":\"" + cityslist[0].Groups[4].Value.Trim() + "\"},";
                                                //拆分区县
                                                regEx = "<span lang=\"EN-US\">([\\d]+)<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style=\"font-family: 宋体\">(\\s*)([\u4e00-\u9fa5]+)</span></p>";
                                                MatchCollection townlist = Regex.Matches(newhtml, regEx, RegexOptions.IgnoreCase | RegexOptions.Multiline);
                                                if (townlist.Count > 0)
                                                {
                                                    for (int j = 0; j < townlist.Count; j++)
                                                    {
                                                        var town = townlist[j].Groups[0].Value.Trim();
                                                        newjson += "{";
                                                        newjson += "\"PId\":\"" + cityId + "\",";
                                                        newjson += "\"AreaId\":\"" + Utils.ObjToInt(townlist[j].Groups[1].Value.Trim(), 0) + "\",";
                                                        newjson += "\"AreaName\":\"" + townlist[j].Groups[3].Value.Trim() + "\"},";
                                                    }
                                                }

                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    newjson = "{\"status\":\"n\",\"info\":\"省份代码为空!,请核查采集源码!\"}";
                                }
                            }
                        }

                    }
                    newjson = newjson.Substring(0, newjson.Length - 1);
                    newjson += "]";

                }
                else
                {
                    newjson = "{\"status\":\"n\",\"info\":\"页面数据标签位置变动,请核查采集源码!\"}";
                }
            }
            else
            {
                newjson = "{\"status\":\"n\",\"info\":\"采集页面数据格式变动,请核查采集源码!\"}";
            }
            return newjson;
        }

    }
时间: 2024-11-10 16:33:20

国标地址采集的相关文章

PHP利用socket_bind函数切换IP地址采集数据

在利用PHP进行数据采集的过程中,通常会遇到IP被屏蔽或出现验证码的情况:为了能够继续采集,我们需要切换不同的ip,每访问一次,随机切换一个IP.当然也可以通过收集大量代理,通过切换代理的方式进行采集,原理大抵相似.       因为本人在实际工作中遇到这种情况,刚好发生的场景在美国站群的服务器,上面有已经绑定了200多个ip(这种服务器1300元一月),因此可以轻松的利用socket_bind()函数进行出口ip的绑定,只需要随机抽取一个IP进行绑定就可以.           在C#中同样可

Python之通过IP地址库获取IP地理信息

利用第三方的IP地址库,各个公司可以根据自己的业务情况打造自己的IP地址采集分析系统.例如游戏公司可以采集玩家地区信息,进行有针对性的运营策略,还可能帮助分析玩家网络故障分布等等. #!/usr/bin/env python # -*- coding:utf-8 -*- import requests import json import argparse import sys def get_ip_info(ip): # 淘宝IP地址库 url = "http://ip.taobao.com/

Opera官网打不开 下载Opera最新版本的实际地址

目前Opera官网可以打开,但是点下载时就会出错,国内无法访问Opera的下载地址,无法通过官网直接下载Opera浏览器.下面提供下载的方式. 一.通过官方的ftp站点下载 FTP地址为 http://ftp.opera.com/pub/opera/desktop/ 如图,选择合适的版本即可下载 虽然可以下载,不过下载速度有时候非常的慢,很坑爹. 二.通过快乐浏览站点下载 快乐浏览里定期更新主要浏览器的最新下载链接,通过此站点可以直接下载到最新的主流浏览器,当然包括Opera浏览器. 访问:快乐

解析爱博Email搜索圣手的使用说明

爱博Email搜索圣手是一款功能强大.简单易用.界面友好的高速定向的邮件地址采集搜索工具软件,支持百度.Google邮件搜索,本地Email搜索和论坛的邮箱搜索.爱博Email搜索圣手集成了按网址搜索.按关键字采集邮件地址,支持对互联网.本地目录和本地具体文件的搜索和提前邮件地址.您可以选择搜索某一网址下所有网页中出现的邮件地址,也可以通过关键字,借助百度.Google等流行的搜索圣手采集相关的邮件地址.无论您选择哪一种邮件地址采集方式,搜索出来的Email都是具有极高的网址和关键字定向性,最大

电子商务知识精华,屌丝完美逆袭!(转)

电子商务知识精华,屌丝完美逆袭! 何为电子商务? 电子商务源于英文ELECTRONIC COMMERCE,简写为EC.顾名思义,其内容包含两方面,一是电子方式,二是商贸活动.指商务活动的电子化.网络化,通过Internet的技术或各种商务网络平台,完成商务交易,获得产品和服务. 1)        优点:品种齐全,种类繁多,一站购物,电子支付,市场全球化,全天候服务,成本低廉化(营销.店铺大小,地理位置.生产商直销等),减少人力物力,网络代购(国外独有品牌.国外价格优势.新鲜好玩),价格比较,网

开源网络爬虫汇总

Awesome-crawler-cn 互联网爬虫,蜘蛛,数据采集器,网页解析器的汇总,因新技术不断发展,新框架层出不穷,此文会不断更新... 交流讨论 欢迎推荐你知道的开源网络爬虫,网页抽取框架. 开源网络爬虫QQ交流群:322937592 email address: liinux at qq.com Python Scrapy - 一种高效的屏幕,网页数据采集框架. django-dynamic-scraper - 基于Scrapy内核由django Web框架开发的爬虫. Scrapy-R

通什翡翠商城大站协议邮件群发系统日发20-30万封不打码不换ip不需发件箱100%进收件箱

用一种新的技术思维去群发邮件 一种不用换IP,不需要任何发件箱的邮件群发方式 一种不需要验证码,不需要**代码变量的邮件群发方式 即使需要验证码也能全自动识别验证码的超级智能软件 教你最核心的邮件群发思维和软件群发技术图片链接不是 问题50%~90%进入收件箱让你不再为进垃圾箱而发愁 每天群发100万封邮件不再是难题 懒人技术升级版大站协议邮件群发 提供的不仅仅是软件更重要的是群发技术 邮件群发神器简介:什么是通什翡翠商城大站协议邮件群发系统? 通什翡翠商城大站协议邮件群发系统,是通过签署邮件群

懒人邮件群发日发50-100万封不打码不换IP不需发件箱大站协议系统营销软件100%进收件箱

用一种新的技术思维去群发邮件 一种不用换IP,不需要任何发件箱的邮件群发方式 一种不需要验证码,不需要**代码变量的邮件群发方式 即使需要验证码也能全自动识别验证码的超级智能软件 教你最核心的邮件群发思维和软件群发技术图片链接不是 问题50%~90%进入收件箱让你不再为进垃圾箱而发愁 每天群发100万封邮件不再是难题 懒人技术升级版大站协议邮件群发 提供的不仅仅是软件更重要的是群发技术 邮件群发神器简介:什么是懒人群发技术大站协议升级版? 懒人群发大站协议升级版,是通过签署邮件群发服务器协议的大

博众时时彩源码下载搭建教程

开发技术:采用成熟开源的PHP语言,开奖端采用C++语言而写,根据网游原理开发而成,内部集成多采集地址采集开奖号码.解决一些开奖采集不号问题.线程为多线程, 开奖与反奖速度上都比较稳定.程序采用PHP写框架,易扩展性.同时在风险控制各方面都有所保证,支持同时在线5000人以上,只要服务器配置与网络带宽没问题前提下. ·游戏记录:可以查看自己或下级代理(会员)的投注记录.盈亏记录.账变记录. ·安全中心:可以修改登录密码和资金密码,银行资料. ·团队功能:有团队总盈亏值,明细表,账变等. ·代理中