获取全部的地区并生成表格

news2024/9/22 13:29:01

思路

        写文章的时间2023-8-4,大部分网页设置的区域都是先是省,然后通过省获取对应的市,再通过市获取对应的区,以此类推。所以模拟的请求也是按照这个逻辑,先获取所有的省,再获取所有的市,最后获取所有的区。


实现方法

        博主其实是需要根据用户指定的地区做一些其他的请求,但是用户不可能知道这个地区对应的id,所以直观的展示就想到:用区域的名作为键,id作为值,但是区域名字可能会相同,例如不同的市但存在同名的区,所以最终想到用嵌套字典的方法来进行存储,因为不可能省市区都是一样的。

所以最终字典的样子是这样子的:


代码

        代码解释

                获取区域对应的id和名字,走了三次循环进行获取,定义一个字典,将获取到的区域的名字作为键,值也是一个字典,这个字典就包含当前区域的id,然后下一级的区域名字,如此嵌套。字典的样子:

{
    '广东':{
        "id": "19",
        "潮州市": {
            "id": "1705",
            "潮安区": {
                "id": "19992",
            },
        },
        "东莞市": {
            "id": "1655",
            "常平镇": {
                "id": "4886",
            },
            "长安镇": {
                "id": "4760",
            },
        },
    },
    '其他省份':{'以此类推'}
}

         具体详细代码

                对于数据解析部分,由于每个网页返回的结构不一样,需要自己去解析对应的数据

# -*- coding: utf-8 -*- 
# @Time : 2023/7/13 15:05
# @Author : gongzairen
# @File : get_areas_id_dict.py

import json
import random
import time

import requests


class GetAreasId:
    def __init__(self,sku_id):
        self.sku_id = sku_id
        self.data_dict = {}

    # 获取区域id
    def get_areas_id(self):
        """

        :return: 返回的是包含省,市,区的id 的dict
        逻辑很混乱多层嵌套,效果并不好
        样例:
        {'北京': {'id': '2', '北京市': {'id': '36', '东城区': {'id': '377'}, }},'天津': {'id': '3', '天津市': {'id': '37', '和平区': {'id': '395'},}}}
        """
        data_dict = {
            "data": "",
            "error_info": "无",
            'warning_info': "无",
        }

        url = '对应的url'
        headers = HEADERS
        headers['Referer'] = f'对应的referer'
        headers['Accept'] = '对应的Accept'

        all_areas_id_dict = {}
        # 获取省id
        province_payload = {
            '请求的参数': '请求的参数',
        }
        province_response = requests.get(url,params=province_payload,headers=headers)
        province_json = province_response.json()
        province_response.close()
        # print(province_json)
        try:
            id_lists = province_json['rows']
            for id_dict in id_lists:
                province_name = id_dict['name']
                province_id_dict = {
                    'id': str(id_dict['id']),
                    'level': str(id_dict['level']),
                }
                all_areas_id_dict[province_name] = province_id_dict
        except Exception as e:
            data_dict['error_info'] = '区域id结果已发生改变,请联系开发人员'
            print('区域id结果已发生改变,请联系开发人员')
            print(e)
            return data_dict


       # 获取市id
        for province_name in all_areas_id_dict:
            time.sleep(random.uniform(0,2.2))
            city_payload = {
                '请求的参数': '请求的参数',
            }
            city_response = requests.get(url, params=city_payload, headers=headers)
            city_json = city_response.json()
            city_response.close()
            # print(city_json)
            try:
                id_lists = city_json['rows']
                for id_dict in id_lists:
                    city_name = id_dict['name']
                    city_id_dict = {
                        'id': str(id_dict['id']),
                        'level': str(id_dict['level']),
                        'parentId':str(id_dict['parentId'])
                    }
                    all_areas_id_dict[province_name][city_name] = city_id_dict
            except Exception as e:
                data_dict['error_info'] = '区域id结果已发生改变,请联系开发人员'
                print('区域id结果已发生改变,请联系开发人员')
                print(e)
                return data_dict

        # 获取区id
        for province_name in all_areas_id_dict:
            city_list = list(all_areas_id_dict[province_name].keys())
            for city_name in city_list:
                if city_name == "id" or city_name == "level":
                    continue
                time.sleep(random.uniform(1, 3))
                area_payload = {
                    '请求的参数': '请求的参数',
                }

                area_response = requests.get(url, params=area_payload, headers=headers)
                area_json = area_response.json()
                area_response.close()
                print(area_json)

                try:
                    id_lists = area_json['rows']
                    for id_dict in id_lists:
                        area_name = id_dict['name']
                        area_id_dict = {
                            'id': str(id_dict['id']),
                            'level': str(id_dict['level']),
                            'parentId':str(id_dict['parentId'])
                        }
                        all_areas_id_dict[province_name][city_name][area_name] = area_id_dict
                except Exception as e:
                    data_dict['error_info'] = '区域id结果已发生改变,请联系开发人员'
                    print('区域id结果已发生改变,请联系开发人员')
                    print(e)
                    return data_dict

        data_dict['data] = all_areas_id_dict
        print(all_areas_id_dict)
        return data_dict


test_sku_id = 'xxxxxx'

HEADERS = {
    'Cookie': 'xxxxxx',
}
get_areas_obj = GetAreasId(test_sku_id)
get_areas_result_dict = get_areas_obj.get_areas_id()
if get_areas_result_dict ['error_info'] != "无":
    print('获取失败')
else:
    all_areas_id_dict = get_areas_result_dict['data']

生成对应的表 

data = "上面生成的字典" # all_areas_id_dict 
id_lists = []
for province_name in data:
    city_list = list(data[province_name].keys())
    for city_name in city_list:
        if city_name == "id" or city_name == "level" or city_name == 'parentId':
            continue
        area_list = list(data[province_name][city_name].keys())
        for area_name in area_list:
            if area_name == "id" or area_name == "level" or area_name == 'parentId':
                continue
            id_lists.append([province_name,city_name,area_name])

print(id_lists)

df = pd.DataFrame(id_lists, columns=['省', '市', '区'])

file_name = 'xxxx地区全表.xlsx'
df.to_excel(file_name, index=False)
print(f"Excel文件已生成: {file_name}")

        效果如下 

                ​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/834664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2023华数杯全国大学生数学建模竞赛】C题 母亲身心健康对婴儿成长的影响第一、二问

第一问部分截图 第二问部分截图 参考文献 理论和可直接运行代码获取参见:理论和可直接运行代码获取参见:理论和可直接运行代码获取参见:理论和可直接运行代码获取参见: 有人看的话更新后续问题思路。

【项目经验】产研流程(超级详细的步骤)

一、产研流程简述 项目立项-——定需求——Sprint需求宣讲会——技术方案——技术方案评审会——开发及单元测试——测试用例评审会——提测——测试——Sprint评审会——发版——Sprint复盘会 二、产研流程详情 以下部分根据Sprint里程碑节点进行循环(sprint周期…

Java8实战-总结12

Java8实战-总结12 Lambda表达式Lambda 和方法引用实战第1步:传递代码第2步:使用匿名类第3步:使用Lambda表达式第4步:使用方法引用 复合Lambda表达式的有用方法比较器复合逆序比较器链 函数复合 Lambda表达式 Lambda 和方法引用实…

【C++】从无到有了解并掌握C++面向对象编程的三大特性——封装、继承、多态

前置知识:类和对象 参考书籍:《C Primer 第五版》 目录 什么是面向过程?什么是面向对象? 一、封装 1、封装的含义以及如何实现封装 1.1 访问限定符(访问说明符) 1.2 什么是封装? 2、封装的优点…

2023年华数杯选题人数发布!!

该选题人数,主要基于根据各个平台开赛后12小时各项数据统计,进行评估(方法见注释),最终得出2023年华数杯选选题人数,大致为 题号选题人数A120B159C420 注释:选题人数来源:源自各个平…

Java字符串常量池以及new String(“abc“)到底创建了几个对象?各种字符串到底相不相等?

new String(“abc”)到底创建了几个对象? 字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。 1.如果字符串常量池中不存在“abc”的引用&#xff…

GD32F103VE外部中断

GD32F103VE外部中断线线0~15,对应外部IO口的输入中断。它有7个中断向量,外部中断线0 ~ 4分别对应EXTI0_IRQn ~ EXTI4_IRQn中断向量;外部中断线 5 ~ 9 共用一个 EXTI9_5_IRQn中断向量;外部中断线10~15 共用一个 EXTI15_10_IRQn中断…

深入探索Vue.js核心技术与跨平台开发uni-app实战

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 前言 在当今Web应用不断…

小程序商城免费搭建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景+b2b2c bbc

​ 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前…

7、Kubernetes核心技术 - Secret

目录 一、Secret概述 二、Secret 三种类型 2.1、Opaque 2..2、kubernetes.io/dockerconfigjson 2.3、kubernetes.io/service-account-token 三、Secret创建 3.1、命令行方式创建 Secret 3.2、yaml方式创建 Secret 四、Secret解码 五、Secret使用 5.1、将 Secret 挂载…

Mybatis实现JsonObject对象与JSON之间交互

项目中使用PostGresql数据库进行数据存储,表中某字段为Json类型,用于存储Json格式数据。PG数据库能够直接存储Json算是一大特色,很多特定情境下使用直接存储Json字段数据能够大量节省开发时间,提高后台数据查询和转换效率。 1、基…

第三章 图论 No.1单源最短路及其综合应用

文章目录 1129. 热浪1128. 信使1127. 香甜的黄油1126. 最小花费920. 最优乘车903. 昂贵的聘礼1135. 新年好340. 通信线路342. 道路与航线341. 最优贸易 做乘法的最短路时,若权值>0,只能用spfa来做,相等于加法中的负权边 1129. 热浪 1129.…

Spring接口ApplicationRunner的作用和使用介绍

在Spring框架中,ApplicationRunner接口是org.springframework.boot.ApplicationRunner接口的一部分。它是Spring Boot中用于在Spring应用程序启动完成后执行特定任务的接口。ApplicationRunner的作用是在Spring应用程序完全启动后,执行一些初始化任务或处…

W6100-EVB-PICO做DNS Client进行域名解析(四)

前言 在上一章节中我们用W6100-EVB-PICO通过dhcp获取ip地址(网关,子网掩码,dns服务器)等信息,给我们的开发板配置网络信息,成功的接入网络中,那么本章将教大家如何让我们的开发板进行DNS域名解…

python二级用哪个版本的软件,二级python用哪个版本

大家好,给大家分享一下python二级用哪个版本的软件,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! Python开发软件可根据其用途不同分为两种,一种是Python代码编辑器,一种是Python集成开发工具&#xff…

Mac显示隐藏文件夹

1、设置隐藏文件可见 defaults write com.apple.finder AppleShowAllFiles TRUE 2、killall Finder killall Finder

H3C交换机如何清除接口配置信息

环境: H3C S6520-26Q-SI 问题描述: H3C交换机如何清除接口配置信息 解决方案: 在接口下使用default命令 [H3C-Ten-GigabitEthernet1/0/3]dis th # interface Ten-GigabitEthernet1/0/3port link-mode bridgeport link-type trunkport tr…

linux的搭建以及网关配置

Linux 目前国内 Linux 更多的是应用于服务器上,而桌面操作系统更多使用的是 Windows 安装linux虚拟机 网址 VMware下载网址 点击Workstation 16 Pro for Windows下载 安装CentOS centO下载网址 依次点击 7.6.1810/ isos/ x86_64/ CentOS-7-x86_64-DVD-1810.…

面试热题(前中序遍历构建树)

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 题目中是给定两个数组,一个是存放这颗树的前序遍历的数组,一个是存放这棵树的…

一个严肃的话题,ADR会取代WAF和RASP吗?

做安全的人应该都对WAF耳熟能详,也就是我们常说的Web应用防火墙,成为了应用安全防护的明星产品之一。从传统的防火墙、IDS、IPS,再到WAF横空出世,引领技术趋势若干年,这一阶段可以称为应用安全防护1.0时代。作为一款成…