首页 > 其他分享 >爬取行政区划代码

爬取行政区划代码

时间:2024-02-27 18:44:21浏览次数:29  
标签:province code get url 代码 child 爬取 html 行政区划

爬取国家统计局统计用区划代码和城乡划分代码 2023 版

python 实现

一、打开国家统计局官网

https://www.stats.gov.cn/sj/tjbz/qhdm/
image

二、分析每一级URL找到规律

省级:https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/index.html
地市级:https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/61.html 61为陕西编码
区县级:https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/61/6101.html
image

找到规律 当前路径+href 路径即可跳入下一级

打码

import json
import time

import requests
from bs4 import BeautifulSoup

main_url = "https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023"


class area_code:
    name = ""
    code = ""
    url = ""
    child = []
    urban_rural_type = 0
    lng = 0
    lat = 0

    def __init__(self, name, code, url, child, urban_rural_type=0):
        self.name = name
        self.code = code
        self.url = url
        self.child = child
        self.urban_rural_type = urban_rural_type
        self.lng = 0
        self.lat = 0


# 爬取全国统计用区划代码和城乡划分代码
# pip install beautifulsoup4
def get_code(suffix_url="index.html"):
    _province_url = "{}/{}".format(main_url, suffix_url)
    response = requests.get(_province_url)
    response.encoding = "utf-8"
    _html = response.text
    _soup = BeautifulSoup(_html, "html.parser")
    _province_code = {}
    for a in _soup.find_all("a"):
        if a.get("href") and a.get("href").endswith(".html"):
            _province_code[a.text] = a.get("href")
    return _province_code


def get_child_code(_url, _parent_url=None, _retry=3):
    """
    输出 [{name:"呼和浩特市", code:"150100000000", url:"15/1501.html"},{name:"包头市", code:"150200000000", url:"15/1502.html"}]
    :param _parent_url: 父级url
    :param _retry: 重试次数
    :param _url: 当前url
    :return:
    """
    _city_code = []
    if _parent_url is not None and len(_parent_url) > 0:
        # 截取最后一个"/"之前的字符串
        _parent_path = _parent_url.rsplit("/", 1)[0]
        _req_url = "{}/{}".format(_parent_path, _url)
    else:
        _req_url = "{}/{}".format(main_url, _url)
    try:
        response = requests.get(_req_url)
    except Exception as e:
        if _retry > 0:
            time.sleep(1)
            print("请求出错:{},第{}次重试".format(e, 4 - _retry))
            return get_child_code(_url, _parent_url, _retry - 1)
        else:
            raise e
    response.encoding = "utf-8"
    _html = response.text
    _soup = BeautifulSoup(_html, "html.parser")

    # class_="citytr" or class_="towntr" or class_="countytr" or class_="villagetr"
    for tr in _soup.find_all("tr", class_=["citytr", "towntr", "countytr"]):
        _tds = tr.find_all("td")
        print("开始处理 - {}".format(_tds[1].text))
        _child_url = ""
        if _tds[0].find("a") is not None and _tds[0].find("a").get("href") is not None:
            _child_url = _tds[0].find("a").get("href")
            if _child_url.endswith(".html"):
                _child = get_child_code(_child_url, _req_url)
                _city_code.append(area_code(_tds[1].text, _tds[0].text, _child_url, _child))
        else:
            _city_code.append(area_code(_tds[1].text, _tds[0].text, _child_url, []))
    for tr in _soup.find_all("tr", class_=["villagetr"]):
        _tds = tr.find_all("td")
        code = _tds[0].text
        urban_rural_type = _tds[1].text
        name = _tds[2].text
        _city_code.append(area_code(name, code, "", [], urban_rural_type))
    return _city_code


def get_province_list():
    """
    # 获取省份、直辖市、自治区代码
    :return:
    """
    province_map = get_code()
    _province_list = []
    for _name, _url in province_map.items():
        _province_list.append(area_code(_name, _url.split(".")[0], _url, []))
    return _province_list


if __name__ == '__main__':
    province_list = get_province_list()
    # 获取市级代码
    for province in province_list:
        print("开始处理 - {}".format(province.name))
        city_code = get_child_code(province.url)
        province.child = city_code
    # 输出到文件json
    with open("area_code.json", "w", encoding="utf-8") as f:
        f.write(json.dumps(province_list, default=lambda obj: obj.__dict__, ensure_ascii=False))

缺陷

不支持退出续爬,后续完善....

标签:province,code,get,url,代码,child,爬取,html,行政区划
From: https://www.cnblogs.com/bigroc/p/18037559

相关文章

  • RCE命令执行&代码执行漏洞
    RCE命令执行&代码执行漏洞RCE命令执行漏洞RCE漏洞简介RCE(remotecode/commandexecute)远程代码/命令执行漏洞RCE漏洞是两个漏洞:代码执行漏洞 #针对后端语言!命令执行漏洞 #针对系统!如何产生在Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码......
  • android 混淆规则作用,Android代码混淆详解
    一、混淆的意义混淆代码并不是让代码无法被反编译,而是将代码中的类、方法、变量等信息进行重命名,把它们改成一些毫无意义的名字,同时也可以移除未被使用的类、方法、变量等。所以直观的看,通过混淆可以提高程序的安全性,增加逆向工程的难度,同时也有效缩减了apk的体积。总结如下:1、......
  • 代码随想录 day63 下一个更大元素II 接雨水
    下一个更大元素II更下一个最大元素是一样的思路需要处理的是成环数组的模拟过程可以把两个一样的目标数组拼接在一起这样就相当于它成环了或者i变成两倍的范围然后目标下标就变成i%length这样i就会落回目标数组的下标也就是成环了接雨水实际上双指针法可能更......
  • 代码随想录 第六天 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交
    LeetCode:242.有效的字母异位词-力扣(LeetCode)思路:既然只判断两个字符串的字母,就一个++,一个--,最后如果二十六个字母都是零,说明两个字符串相等。反思: //charat(i)是返回字符串索引,所以s.charAt(i)-'a'实际上是获取字符串s中第i个字符相对于字母'a'的偏移量。......
  • 使用C#混淆加密大师保护你的代码 (代码混淆加壳工具,支持dll/exe混淆加密)
    C#混淆加密大师可以加密混淆C#编写的dll和exe程序(包括Winform程序,WPF程序,Unity游戏程序,控制台程序等),支持.NetFramework2.0~.NetFramework4.x,以及.NETCore2.0-.NET8。除了加密混淆代码功能,C#混淆加密大师还可以对EXE程序进行加壳,增加防篡改,注入垃圾数据等功能,可以......
  • 汇编语言和本地代码是一一对应的
    接下来就让我们进入到本章的前半部分。在前面章节中已经多次提到,计算机CPU能直接解释运行的只有本地代码(机器语言)程序。用C语言等编写的源代码,需要通过各自的编译器编译后,转换成本地代码。通过调查本地代码的内容,可以了解程序最终是以何种形式来运行的。但是,如果直接打开本地......
  • 《梦断代码》1.31
     《梦断代码》的第三章节中,作者描述了主人公对于代码的热爱和执着。代码不仅是一种工具,更是一种信仰,一种对于美的追求。主人公对于编程的热情和执着让人感动,他不断地学习和探索,不断地追求完美的代码。这一章节让人深刻地感受到了主人公对于代码的热爱和追求,也让人对于编程这门......
  • 代码中打开新窗体,前端和后端
    前端:1、window.open()window.open() 方法是JavaScript中的一个内置方法,用于在浏览器中打开一个新的窗口或标签页。1)语法:window.open(url,name,features,replace);注意:由于弹出窗口的滥用已经成为了一个安全问题,现代浏览器通常会默认阻止 window.open() 方法的调用,除非是......
  • CMS电影站源代码分析
    最近研究了一些CMS的电影站 最近研究了一些CMS,发现很多人都不知道cms的作用,甚至有些人根本不知道cms是什么东西。月亮岛影视今天就给大家介绍一下cms的作用。希望对大家有帮助。二十条在线下面我们一起来看一下。首先我们要了解cms的概念。cms是一个企业网站的基础设施,它可以帮......
  • vue3前端代码
    <template><divclass="login-back"><divclass="login-container"><h2>人口信息管理系统</h2><el-formref="loginFormRef":model="loginForm":rules="loginRule......