HTML应用指南:利用GET请求获取全国中国建设银行网点位置信息

中国建设银行(China Construction Bank)作为中国领先的国有大型商业银行,始终坚守"以人民为中心"的发展理念,深入践行"服务大众、促进民生、赋能实体"的使命担当,致力于为个人客户、公司客户及机构客户提供专业、稳健、安全、便捷的综合化、智能化、全球化金融服务。依托"住房租赁、普惠金融、金融科技"三大战略,建设银行持续推进"新金融"行动,深化"智慧银行"与"数字生态"建设,构建起覆盖全国所有地级市、延伸至县域及重点乡镇的庞大线下服务网络,并与手机银行、网上银行、自助终端、远程银行等数字渠道深度融合,形成以总分行高效协同为基础、营业网点为支点、线上线下一体化的现代化金融服务体系。

营业网点作为建设银行服务实体经济和百姓民生的重要窗口,不仅是办理存取款、财富管理、个人贷款、对公结算、跨境金融、养老金服务等核心业务的关键载体,更是落实"金融为民"理念、传递"善建者行,成其久远"品牌价值、开展客户陪伴式服务与场景化金融解决方案的重要阵地。各网点严格执行统一的服务标准与视觉识别体系,注重环境的温馨性、功能性与科技感,广泛部署智能柜员机(STM)、自助存取款机、智能导览屏、远程视频柜员(VTM)及适老化服务设施,积极打造"劳动者港湾""智慧网点""养老金融特色网点"等服务标杆,在提升服务效率与风控水平的同时,兼顾老年客户、新市民、户外劳动者等多元群体的差异化需求,持续增强金融服务的可得性、便利性与温度感。

本文将探讨如何通过程序化方式,利用 GET 请求调用建设银行官方平台(如官网网点查询页面或公开接口)的服务端点,自动获取其营业网点分布数据。通过 Python 的 requests 库发送 HTTP 请求,解析返回的 JSON 或 HTML 响应,提取网点名称、所属省市区、详细地址、联系电话、营业时间、地理坐标(经纬度)、网点类型(如综合型、轻型、旗舰型)等关键字段,实现对建设银行网点信息的高效、批量采集。该数据可广泛应用于分析建设银行在全国及重点区域(如京津冀、长三角、粤港澳大湾区、成渝双城经济圈)的渠道布局策略、城乡金融服务覆盖密度、"三大战略"落地成效,以及金融资源与区域经济发展的匹配度,为金融地理研究、网点效能评估、商业选址决策、普惠金融可及性分析及智慧城市金融基础设施规划提供坚实的数据支撑。

中国建设银行网点查询网址:中国建设银行-网点及ATM

首先,我们找到门店数据的存储位置,然后看3个关键部分标头、 负载、 预览;

**标头:**通常包括URL的连接,也就是目标资源的位置;

**负载:**对于GET请求:负载通常包含了传递的参数,有些网页负载可能为空,或者没有负载,因为所有参数都通过URL传递,这里我们可以看到ADiv_Cd(行政区编码),PAGE_JUMP(页码)等标签,没有进行加密;

**预览:**指的是对响应内容的快速查看或摘要显示,可以帮助用户快速了解返回的数据结构或内容片段,我们可以看到数据在OUTLET_DTL_LIST里;

接下来就是数据获取部分,先讲一下方法思路,一共三个步骤;

方法思路

  1. 找到对应行政区编码数据存储位置,生成一个行政区对应关系编码字典;
  2. 我们通过改变查询负载的内容(各级行政区编码),来遍历全国网点,获取所有网点的相关标签数据;
  3. 坐标转换,通过coord-convert库实现GCJ-02转WGS84;

首先,我们观察到它的查询方式依然是通过不同地级行政区编码进行网点查询,那我们直接在"Fetch/XHR"先找到对应数据存储位置, 我们可以看到响应请求包含地级行政区编码对应内容的响应请求,另外,根据上面负载的内容,我们可以知道,数据是直接通过行政区编码进行传递的,为了方便我们可以建立一个包含地级行政区编码的字典,通过遍历行政区编码来查询全国数据;

这里因为直辖市没有 children(children: [ ]);

而非直辖市(如安徽省)有 children,里面是各地级市;

  • 对非直辖市:保存 children 中的每个市(如 340100,合肥市);
  • 对直辖市(110000,120000,310000,500000):因为 children 为空,就直接用省级节点自己作为城市。

**第一步:**利用requests库发送HTTP请求获取所有地级行政区编码表,并根据标签进行保存,另存为csv;

完整代码#运行环境 Python 3.11

python 复制代码
import requests
import json
import csv

# 直辖市编码集合
MUNICIPALITIES = {"110000", "120000", "310000", "500000"}

url = "https://www1.ccb.com/cn/v3/js/city_bank_data.js"
print("正在请求建行行政区编码数据...")
resp = requests.get(url, timeout=10)
resp.encoding = 'utf-8'
text = resp.text.strip()

# 剥离 jsonpCallback(...)
if text.startswith('jsonpCallback(') and text.endswith(')'):
    json_str = text[14:-1]
else:
    raise RuntimeError(" 响应格式不是 jsonpCallback(...)")

data = json.loads(json_str)

results = []
for province in data["cityList"]:
    prov_code = province["cityCode"]
    prov_name = province["cityName"]

    children = province.get("children", [])

    if prov_code in MUNICIPALITIES:
        # 直辖市:children 为空,直接用省级作为城市
        results.append((prov_code, prov_name, prov_code))
        print(f"直辖市 → {prov_name} ({prov_code})")
    else:
        # 非直辖市:遍历 children
        for city in children:
            city_name = city["cityName"]
            city_code = city["cityCode"]
            results.append((prov_code, city_name, city_code))
            print(f" {prov_name} → {city_name} ({city_code})")

# 保存 CSV
output_file = "ccb_city_list.csv"
with open(output_file, "w", encoding="utf-8-sig", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["省份编码", "城市名称", "城市编码"])
    writer.writerows(results)

print(f"共保存 {len(results)} 条记录")
print(f"文件: {output_file}")

数据会以csv表格的形式,保存在运行脚本的目录下,数据标签包括:省份编码、城市名称、城市编码;

第二步:利用requests库发送HTTP请求遍历365个行政区编码并获取所有中国建设银行网点数据,并根据标签进行保存,另存为csv;

完整代码#运行环境 Python 3.11

python 复制代码
import requests
import csv
import time
import os

# ====== 配置 ======
CITY_LIST_FILE = "ccb_city_list.csv"        # 输入:城市列表
OUTPUT_FILE = "ccb_all_branches.csv"        # 输出:合并后的总文件

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    "Referer": "https://www.ccb.com/cn/home/branch.html",
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "zh-CN,zh;q=0.9"
}

def parse_time(start, end):
    return "不营业" if start == "00:00:00" or not start else f"{start[:5]}-{end[:5]}"

def fetch_page(page_num, adiv_cd):
    try:
        resp = requests.get(
            "https://www1.ccb.com/tran/WCCMainPlatV5",
            params={
                "CCB_IBSVersion": "V5",
                "SERVLET_NAME": "WCCMainPlatV5",
                "isAjaxRequest": "true",
                "TXCODE": "NZX013",
                "Enqr_Cnd_Cntnt": "",
                "isJSONRequest": "true",
                "ADiv_Cd": adiv_cd,
                "Kywd_List_Cntnt": "",
                "Enqr_MtdCd": "1",
                "PAGE_JUMP": str(page_num),
                "Cur_StCd": "4"
            },
            headers=HEADERS,
            timeout=10
        )
        return resp.json()
    except Exception as e:
        print(f"请求失败: {e}")
        return None

def scrape_and_append(adiv_cd, city_name, writer):
    page = 1
    total_pages = None
    count = 0

    print(f"\n采集【{city_name}】({adiv_cd})...")

    while True:
        print(f"  ➤ 第 {page} 页...", end="\r")
        data = fetch_page(page, adiv_cd)

        if not data or data.get("SUCCESS") != "true":
            print(f"\n【{city_name}】第 {page} 页异常,跳过")
            break

        if total_pages is None:
            total_pages = int(data.get("TOTAL_PAGE", "1"))

        outlets = data.get("OUTLET_DTL_LIST", [])
        if not outlets:
            break

        for o in outlets:
            writer.writerow({
                "网点名称": o.get("CCBIns_Nm", ""),
                "详细地址": o.get("Dtl_Adr", ""),
                "电话": o.get("Fix_TelNo", "").replace("86-", ""),
                "城市": city_name,
                "区划代码": o.get("ADiv_Cd", ""),
                "经度": o.get("Lgt", ""),
                "纬度": o.get("Ltt", ""),
                "工作日营业时间": parse_time(
                    o.get("Prvt_WkDy_Oprg_StTm", ""),
                    o.get("Prvt_WkDy_Oprg_EdTm", "")
                ),
                "周六营业时间": parse_time(
                    o.get("Prvt_Sat_Oprg_StTm", ""),
                    o.get("Prvt_Sat_Oprg_EdTm", "")
                ),
                "周日营业时间": "不营业",
                "对公业务时间": f"{o.get('CorpWkDyFrnnOprg_StTm', '')[:5]}-{o.get('CorpWkDyFrnnOprg_EdTm', '')[:5]} / {o.get('CorpWkDyAftrnOprgStTm', '')[:5]}-{o.get('CorpWkDyAftrnOprgEdTm', '')[:5]}"
            })
            count += 1

        if page >= total_pages:
            break
        page += 1
        time.sleep(1)

    print(f"\n【{city_name}】完成!新增 {count} 条记录")
    return count

# ====== 主流程 ======
def main():
    # 读取城市列表
    cities = []
    with open(CITY_LIST_FILE, "r", encoding="utf-8-sig") as f:
        reader = csv.DictReader(f)
        for row in reader:
            cities.append((row["城市编码"], row["城市名称"]))

    print(f"共 {len(cities)} 个城市,开始合并采集...")

    # 创建输出文件并写入表头
    fieldnames = [
        "网点名称", "详细地址", "电话", "城市", "区划代码",
        "经度", "纬度", "工作日营业时间", "周六营业时间",
        "周日营业时间", "对公业务时间"
    ]

    total_count = 0
    with open(OUTPUT_FILE, "w", encoding="utf-8-sig", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()

        for adiv_cd, city_name in cities:
            count = scrape_and_append(adiv_cd, city_name, writer)
            total_count += count
            f.flush()  # 确保实时写入
            time.sleep(2)  # 城市间间隔,降低风控风险

    print(f"\n全部完成!总计采集 {total_count} 条网点数据")
    print(f"已保存至: {OUTPUT_FILE}")

if __name__ == "__main__":
    main()

第三步: 坐标系转换,由于中信银行网点数据使用的是高德坐标系(GCJ02),为了在ArcGIS上准确展示而不发生偏移,我们需要将网点的坐标从GCJ02转换为WGS-84坐标系。我们可以利用coord-convert库中的gcj2wgs(lng, lat)函数,也可以用免费这个网站:批量转换工具:地图坐标系批量转换 - 免费在线工具

对CSV文件中的网点坐标列进行转换,完成坐标转换后,再将数据导入ArcGIS进行可视化;

接下来,我们进行看图说话:

根据中国建设银行营业网点分布图可见,其网点布局呈现出高度集中于东部沿海经济发达地区 的显著特征。从地图上看,京津冀、长三角、粤港澳大湾区 三大城市群是网点密度最高的区域,尤其是北京、上海、广州、深圳、杭州、南京、苏州 等一线城市及强二线城市,网点密集如网,形成"城市服务核心区 "。这与这些地区经济总量大、人口流动频繁、金融需求旺盛 密切相关,也体现了建设银行作为国有大行在核心城市的资源倾斜和战略部署 。这些高密度网点不仅提供全面的基础金融服务,还特别强调对高端客户群体的专业理财规划和财富管理服务 ,彰显了建行在重点区域市场的竞争力和服务深度

中西部地区网点呈梯度递减分布,但覆盖广泛且逐步均衡化 。以成都、重庆、武汉、西安、郑州 等中部和西部省会城市为中心,形成了次级高密度圈层 ,向周边地市和县域辐射延伸。虽然整体密度低于东部,但建行通过**"轻型网点""智慧网点""普惠金融服务站"** 等方式,实现了对中西部主要城市和重点县域的全覆盖 ,尤其在成渝双城经济圈、长江中游城市群 等国家战略区域布局密集,体现出其支持区域协调发展战略的主动作为 。此外,建行还特别关注中西部地区的特色产业发展需求 ,例如农业产业化、文化旅游业等,通过定制化的金融服务方案 ,助力地方经济多元化发展

西北与边远地区网点稀疏,但关键节点保持存在 。新疆、青海、西藏、内蒙古等地的网点数量明显较少,分布零散,主要集中在乌鲁木齐、呼和浩特、西宁、拉萨 等首府城市以及部分地级市,反映出地理环境、人口密度和经济发展水平 对金融基础设施布局的制约。然而,建行仍通过远程银行、移动服务车、自助终端等数字化手段 弥补物理网点不足,确保基本金融服务可及性 ,体现了其"普惠金融 "理念的实践落地。特别是在一些偏远牧区或山区,建行利用金融科技的力量 ,打破了地域限制,为当地居民提供了便捷的存取款、转账支付等基础金融服务,极大地提升了金融服务的覆盖面和包容性

总体来看,中国建设银行的网点布局呈现"东密西疏、核心集聚、层级分明、城乡联动 "的空间格局,既服务于国家经济发展重心 ,又兼顾区域平衡与民生需求 。这种布局不仅反映了其作为国有大型商业银行的市场主导地位 ,也彰显了其在推动金融资源优化配置、支持乡村振兴、促进共同富裕 等方面的担当与能力。未来随着"数字银行 "和"智慧金融 "的深化发展,建行的服务网络将更加立体多元,实现从"​​​​​​​有形网点 "到"​​​​​​​无形触达 "的升级跃迁。建行将继续依托科技力量 ,不断探索创新服务模式,力求为客户提供更优质、更高效、更具个性化的金融服务体验。

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

相关推荐
王翼鹏2 小时前
html 全角空格和半角空格
前端·html
敲代码的嘎仔2 小时前
JavaWeb零基础学习Day2——JS & Vue
java·开发语言·前端·javascript·数据结构·学习·算法
CsharpDev-奶豆哥3 小时前
jq获取html字符串中的图片逐个修改并覆盖原html的解决方案
前端·html
骷髅头的寂寞3 小时前
Spring Boot 整合 Thymeleaf 生成 HTML 页面教学
spring boot·html·intellij-idea
IT_陈寒3 小时前
Python性能优化:用这5个鲜为人知的内置函数让你的代码提速50%
前端·人工智能·后端
简小瑞3 小时前
VSCode源码解密:一行代码解决内存泄漏难题
前端·设计模式·visual studio code
邢行行3 小时前
Node.js 核心模块与模块化笔记
前端
Asort3 小时前
JavaScript设计模式(九)——装饰器模式 (Decorator)
前端·javascript·设计模式
Man3 小时前
🔥 Vue3 动态 ref 黑科技:一招解决 v-for 中的组件引用难题!
前端·vue.js