从国家统计局获取最新国家省市区的行政区域数据

源代码

import requests
from bs4 import BeautifulSoup
import pymysql
import time

class Administrative(object):
    def __init__(self):
        self.db = pymysql.connect("127.0.0.1","root","a","travel",charset="utf8mb4")
        self.main()
        self.db.close()

    def main(self):
        base_url='http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/'
        trs=self.get_response(base_url,'provincetr')
        for tr in trs:#循环每一行
            datas=[]
            for td in tr:#循环每个省
                province_name=td.a.get_text()
                province_url=base_url+td.a.get('href')
                print(province_name)
                trs=self.get_response(province_url,None)
                for tr in trs[1:]:#循环每个市
                    city_code=tr.find_all('td')[0].string
                    city_name=tr.find_all('td')[1].string
                    city_url=base_url+tr.find_all('td')[1].a.get('href')
                    trs=self.get_response(city_url,None)
                    for tr in trs[1:]:#循环每个区
                        county_code=tr.find_all('td')[0].string
                        county_name=tr.find_all('td')[1].string
                        data=[province_name,city_code,city_name,county_code,county_name]
                        print(data)
                        datas.append(data)
                    time.sleep(1)
            sql="insert into china (province_name,city_code,city_name,county_code,county_name) values (%s,%s,%s,%s,%s)"
            self.connect_mysql(sql,datas)
        
    def get_response(self,url,attr):
        response=requests.get(url)
        response.encoding='gb2312'#编码转换
        soup=BeautifulSoup(response.text,'lxml')
        table=soup.find_all('tbody')[1].tbody.tbody.table
        if attr:
            trs=table.find_all('tr',attrs={'class':attr})
        else:
            trs=table.find_all('tr')
        return trs
             
    def connect_mysql(self,sql,data):
        cursor = self.db.cursor()
        try:
            result=None
            if data:
                if isinstance(data[0],list):
                    cursor.executemany(sql,data)
                else:
                    cursor.execute(sql,data)
            else:
                cursor.execute(sql)
                result=cursor.fetchall()
        except Exception as e:
            print(e)
            self.db.rollback();
        finally:
            cursor.close()
            self.db.commit(); #提交操作
            return result

if __name__=='__main__':
    Administrative()

数据库脚本

DROP TABLE IF EXISTS `china`;
CREATE TABLE `china`  (
  `cid` int(255) NOT NULL AUTO_INCREMENT,
  `province_name` varchar(255),
  `city_code` varchar(255),
  `city_name` varchar(255),
  `county_code` varchar(255),
  `county_name` varchar(255),
  PRIMARY KEY (`cid`) USING BTREE
)

效果图

在这里插入图片描述
我的个人博客网站是:www.coderyyn.cn
上面会不定期分享有关爬虫、算法、环境搭建以及有趣的帖子
欢迎大家一起交流学习

转载请注明

### 获取四川省省市区县乡镇级别的JSON文件 为了获取包含四川省各级行政区划(省、市、区/县、乡镇)的JSON文件,可以考虑以下几个方法: #### 方法一:利用现有API接口 一些第三方平台提供了最新的中国行政区划数据API服务。这些API通常会定期更新以确保数据准确性。 例如,可以通过高德地图开放平台提供的行政区查询API来获取所需的数据[^1]。具体操作如下: - 注册并登录高德开发者账号; - 创建应用获得相应的Key; - 使用GET请求访问`https://restapi.amap.com/v3/config/district?key=您的key&keywords=四川&subdistrict=4`,其中参数`subdistrict=4`表示返回到乡镇级的信息; 此方式的优点在于能够快速得到官方维护的新鲜度较高的地理编码资料,并且支持灵活定制输出字段以及分页加载大量记录等功能特性。 #### 方法二:基于公开资源整理转换 如果希望一次性下载完整的静态文件而不是调用在线API,则可以从网络上寻找可靠的开源项目或者政府发布的权威统计数据集作为基础素材来进行加工处理。 根据已有信息,在2017年有人分享过一份全国性的省市Json文档[^2],虽然时间较早但是作为一个起点仍然具有参考价值。对于更精确的要求来说,可能需要查找更加贴近当前时间节点的数据源,比如国家统计局官方网站或者其他政府部门公布的最新版本行政区域划分公告等。 另外还有专门针对GIS领域提供多格式矢量图形包的地方,像GeoNames.org这样的国际知名站点就收录了很多地区的边界线描述文件(如SHP/KML/JSON/CVS),并且允许用户自由下载用于非商业用途的研究工作之中[^3]。不过需要注意的是这类资源往往侧重于空间位置关系而非纯粹的文字列表形式展示,因此后续还需要借助特定工具完成最终形态上的转变。 ```javascript // 示例代码片段:通过Node.js脚本抓取指定地区下的子节点信息并保存至本地文件 const axios = require('axios'); const fs = require('fs'); async function fetchDistrictData() { try { const response = await axios.get( 'https://restapi.amap.com/v3/config/district', {params: {'key': 'your_api_key_here', keywords: '四川', subdistrict: 4}} ); let districts = []; flatten(response.data.districts, districts); fs.writeFileSync('./cityList/sichuan_formatTree.json', JSON.stringify(districts)); console.log("Successfully saved Sichuan district data."); } catch (error) { console.error(error.message); } } function flatten(nodes, accumulator){ nodes.forEach(node => { accumulator.push({ name: node.name, adcode: node.adcode, level: node.level, children: [] }); if (node.districts && node.districts.length > 0) { flatten(node.districts, accumulator[accumulator.length - 1].children); } }); } ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值