最近项目需要用到省市区数据,现有的数据有些不完整,经过一番查询,没有自己想要的数据,故此去国家统计局采集一份,最新数据截止到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');
备注:采集之后有部分数据下没有区县数据,所以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 ;