从GeoIP免费库里生成IP到省市编号的组合

需求

生成一份从大陆地区的IP到省市编号的映射列表,用于数据分析。

准备工作

统计局提供的标准行政区划代码 http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/,身份证前6位的编号。
从 http://dev.maxmind.com/geoip/geoip2/geolite2/ 下载CSV格式的城市数据库
新浪首页提供一个IP查询接口,可以输出TSV,JSONP,JSON的IP信息

流程

解压包括两个CSV文件:
GeoLite2-City-Blocks.csv:
IP信息
文件头 network_start_ip,network_mask_length,geoname_id,registered_country_geoname_id,represented_country_geoname_id,postal_code,latitude,longitude,is_anonymous_proxy,is_satellite_provider
network_mask_length 是按ipv6的长度计算的,转换为ipv4需要先找出符合ipv4格式的IP,然后使用 32 – 128 + $network_mask_length 转为CIDR。

GeoLite2-City-Locations.csv:
地区信息
文件头 geoname_id,continent_code,continent_name,country_iso_code,country_name,subdivision_iso_code,subdivision_name,city_name,metro_code,time_zone

两个文件使用 geoname_id 关联。

预处理:
拆出IPv4,CIDR,geoname_id

拆出 geoname_id,省编号,省名称,市名称

合并文件,筛出中国的IP:

使用新浪的一个公开的IP查询接口

循环,查IP
数据源的IP是排好序的,所以直接用。不放心的话,可以直接数组排序。

整理的一个地区名称转城市编号的方法:

从GeoIP免费库里生成IP到省市编号的组合 by @sskaje: https://sskaje.me/2014/02/geoip-china-province-city-code-database/

Incoming search terms: