采集最新的省市区县数据

最近项目需要用到省市区数据,现有的数据有些不完整,经过一番查询,没有自己想要的数据,故此去国家统计局采集一份,最新数据截止到2017年;所以采集为2017年的省市区县数据 特此记录采集方式,备忘: 上代码:

header("Content-type: text/html; charset=gb2312");
$year = 2017;
$index = file_get_contents("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/$year/index.html");
preg_match_all('/(.{3,20})/', $index, $matches);
echo '
';
$url = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/$year/";
error_reporting(0);
$prov = array(
    array(),
    array(11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65),
    array('北京市','天津市','河北省','山西省','内蒙古自治区','辽宁省','吉林省','黑龙江省',
        '上海市','江苏省','浙江省','安徽省','福建省','江西省','山东省','河南省',
        '湖北省','湖南省','广东省','广西壮族自治区','海南省','重庆市','四川省','贵州省',
        '云南省','西藏自治区','陕西省','甘肃省','青海省','宁夏回族自治区','新疆维吾尔自治区'
    )
);

$matches = $prov;

for ($i = 0,$e = count($matches[1]); $i < $e; $i++) {
    $index = file_get_contents($url.$matches[1][$i].'.html');
    preg_match_all('/(.{1,30})/', $index, $matche);

    for ($a = 0,$b = count($matche[1]); $a < $b; $a++) {
        $index = file_get_contents($url.$matches[1][$i].'/'.$matche[1][$a].'.html');
        preg_match_all('/(.{1,30})/', $index, $match);
        for ($c = 0,$d = count($match[1]); $c < $d; $c++) {
            $aru = substr($matche[1][$a], 2, 2);
            $index = file_get_contents($url.$matches[1][$i].'/'.$aru.'/'.$match[1][$c].'.html');
            preg_match_all('/(.{1,30})/', $index, $matc);

            //部分省市的html和大部分的不一样,重写规则
            if (!$matc[0]) preg_match_all('/(.{1,30})\d{1,10}(.{1,30})/', $index, $matc);

            $sql = 'REPLACE INTO position (province_id,province_name,city_id,city_name,county_id,county_name,town_id,town_name) VALUES ';
            for ($v = 0,$n = count($matc[1]); $v < $n; $v++) {
                $jil = iconv("utf-8", "gbk//ignore", $matches[2][$i]);
                $sql .= "({$matches[1][$i]},'{$jil}',{$matche[1][$a]},'{$matche[2][$a]}',{$match[1][$c]},'{$match[2][$c]}',{$matc[1][$v]},'{$matc[2][$v]}'),";
            }
            $sql = iconv("gbk", "utf-8//ignore", $sql);

            $sql =rtrim($sql, ",").';';
            file_put_contents("$jil.sql",$sql,FILE_APPEND);

        }
    }
}

注意: 采集耗时较长,需要在页面头部加上set_time_limit取消超时时间限制


set_time_limit(0);
ini_set('max_execution_time', '80000');

5bf2e16a380d6.png


备注:采集之后有部分数据下没有区县数据,所以sql语句为空,需要手动修改一下,也可以修改一下采集规则


附数据库结构

CREATE TABLE `d_position` (
	`province_id` INT(11) NOT NULL,
	`province_name` TINYTEXT NOT NULL,
	`city_id` INT(11) NOT NULL,
	`city_name` TINYTEXT NOT NULL,
	`county_id` INT(11) NOT NULL,
	`county_name` TINYTEXT NOT NULL,
	`town_id` BIGINT(20) NULL DEFAULT NULL,
	`town_name` TEXT NULL
)
COMMENT='省市区'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

评论