开箱即用系列-基础数据-地址码表制作

1.使用背景:

  1. 电商项目中,用户地址,订单地址使用频率会比较高.
  2. 多个平台的地址码表并不统一,有各自不同的标准.
  3. 国家统计局每年有"统计用区划代码和城乡划分代码"的统计
  4. 基于此,考虑用政府网站的数据作为依据,形成自己的地址码表.
    数据来源: 政府网站

2.部分代码实现补充说明:

  • 抓取过程中,页面乱码解决:
    获取返回的HTML内容中,前边一部分字节码,获取网页配置的contentType;尝试用gbk,utf8和iso8895-1来解码,避免出现内容乱码.
    代码逻辑如下:
public static String decodeHtml(byte[] first) {
        try {
            if( Objects.isNull(first) ){ return ""; }
            if( first.length == 0 ){ return ""; }
            byte[] headerBytes = new byte[256];
            if( first.length < 256 ){
                headerBytes = new byte[first.length];
            }
            System.arraycopy(first,0,headerBytes,0,headerBytes.length);
            String header = new String(first,StandardCharsets.ISO_8859_1);

            List<String> regexgroups = new ArrayList<>();
            String regex = "content=\"text/html; charset=(iso-8859-1|iso8859-1|gb2312|GB2312|gbk|GBK|utf-8|UTF-8)\"";
            filterByRegex(regex, regexgroups, header);
            String charset = "charset=utf-8";
            if(!CollectionUtils.isEmpty(regexgroups)){
                charset = regexgroups.get(0);
            }
            String content = "";
            if( charset.toLowerCase().contains("gb2312")){
                content = new String(first,"gbk");
            }
            if( charset.toLowerCase().contains("gbk")){
                content = new String(first,"gbk");
            }
            if( charset.toLowerCase().contains("utf-8")){
                content = new String(first, StandardCharsets.UTF_8);
            }
            if( charset.toLowerCase().contains("ios8859-1")){
                content = new String(first,StandardCharsets.ISO_8859_1);
            }
            if( charset.toLowerCase().contains("ios-8859-1")){
                content = new String(first,StandardCharsets.ISO_8859_1);
            }
            return content;
        } catch (UnsupportedEncodingException e) {
            throw new BaseRuntimeException(e);
        }
    }
  • HTML抓取过程中,使用jsoup工具包;jsoup可以非常方便的操作HTML中的dom元素;类似javascript操作dom元素一样;最新的jsoup版本,在性能上也有较大提升,小规模的抓取数据,可以尝试用jsoup,可以省很多力气.
  • 常用的地址数据,包含三级即够用(京东地址包含四级,而且随时变动,如果第三方要使用京东的地址,使用效果不太好),所以实例中并没有抓取乡镇和街道地址.
  • 几个直辖市的数据处理方式,也参考淘宝地址来做的.
  • 最后对重庆下边的县做了特殊处理,这个是参考淘宝的地址做的处理.
  • 因为国家统计局每年会更新一次地址数据,为了地址数据最新,也可以每年做一次地址数据的更新.
  • 地址表中,预留了地址的坐标字段,这个在实际业务中,可能会用到.
  • 码表中,香港,澳门,台湾部分的数据,请使用者自己添加,可以参考淘宝地址数据.

码云:抓取地址数据源码
2017年-地址码表下载(提取码: yu7p)
2018年-地址码表下载(提取码: pq9a)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
统计用区划代码和城乡划分代码发布说明: 一、编制依据 2008年7月,国务院批复同意国家统计局与民政部、住建部、公安部、财政部、国土部、农业部共同制定的《关于统计上划分城乡的规定》(国函〔2008〕60号),自2008年8月1日实施,正式奠定了统计上划分城乡的理论依据和方法基础。随后,国家统计局印发《统计用区划代码和城乡划分代码编制规则》(国统字〔2009〕91号)。 二、区划范围 统计用区划代码和城乡划分代码的区划范围,是国家统计局开展统计调查的区划范围。未包括我国台湾省、香港特别行政区、澳门特别行政区。 三、发布内容 12位统计用区划代码和3位城乡分类代码。 四、适用领域 《国务院关于统计上划分城乡规定的批复》(国函〔2008〕60号)明确指出:“本规定作为统计上划分城乡的依据,不改变现有的行政区划、隶属关系、管理权限和机构编制,以及土地规划、城乡规划等有关规定”。各级各部门在使用统计用区划代码和城乡划分代码时,请务必结合实际情况。 五、几个具体问题的说明 (一)补充编制开发区统计汇总识别码情况。为满足统计调查工作组织和数据汇总的需要,国家统计局对一些符合条件的开发区编制了统计汇总识别码。统计汇总识别码在统计用区划代码的县级码段上编制,其码段为71~80。 (二)关于河北省沧州市任丘市的苟各庄镇、鄚州镇、七间房乡、保定市高阳县的龙化乡统计用区划代码临时调整情况的说明。按照河北省委、省政府关于对雄安新区周边部分区域实施托管的通知要求,沧州市任丘市的苟各庄镇、鄚州镇、七间房乡划归雄县实施统计上托管,保定市高阳县的龙化乡划归安新县实施统计上托管。为确保统计调查工作的顺利开展, 国家统计局对苟各庄镇、鄚州镇、七间房乡、龙化乡的统计用十二位区划代码进行了临时调整,具体调整为:鄚州镇代码由130982104000变更为130638106000;苟各庄镇代码由130982105000变更为130638107000;七间房乡代码由130982206000变更为130638205000;龙化乡代码由130628204000变更为130632203000。上述变更后的统计用区划代码为临时代码,待民政部门对雄安新区上述4个乡镇区划调整确认后,再将临时代码变更为正式统计用区划代码。 (三)关于黑龙江省大兴安岭地区县级单位统计用区划代码调整情况说明。民政部民函〔2018〕50号文件撤销黑龙江省大兴安岭地区漠河县(六位区划代码为232723),设立漠河市(六位区划代码为232701)。为执行国家标准,保证统计部门与民政部门名称相同的县级单位六位区划代码的一致性,国家统计局根据《统计用区划代码和城乡划分代码编制规则》(国统字〔2009〕91号),调整黑龙江省大兴安岭地区所辖的加格达奇区、松岭区、新林区和呼中区的六位统计用区划代码,具体调整为:加格达奇区代码由232701变更为232761;松岭区代码由232702变更为232762;新林区代码由232703变更为232763;呼中区代码由232704变更为232764。 (四)此版本区划代码与第四次全国经济普查区划代码的相关说明。此版本区划代码是调查截止日期为2018年10月31日的统计用区划代码。由于第四次全国经济普查清查工作于2018年8月开始,四经普的清查和登记工作中采用2018年6月15日的统计用区划代码。第四次全国经济普查数据处理使用2018年10月31日的统计用区划代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值