首页 > 编程语言 >Python爬取国家统计局数据按行业分国有单位就业人员数据

Python爬取国家统计局数据按行业分国有单位就业人员数据

时间:2024-11-20 14:45:11浏览次数:3  
标签:code get Python data wdnodes 爬取 headers 数据 col

Python爬取国家统计局数据按行业分国有单位就业人员数据

0、前言

国家数据,慎爬!!!

因开发需要获取国家统计局数据-按行业分国有单位就业人员数据,特整理此代码用于抓取国家统计局数据按行业分国有单位就业人员数据。

1、数据来源

数据来源于国家统计局
在这里插入图片描述

2、python代码

import pandas as pd
import requests
import time

def fetch_data():
    # 设置请求的头部信息,模拟浏览器访问
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
        "Referer": "https://data.stats.gov.cn/easyquery.htm?cn=C01"
    }

    # 构造请求的 URL 和参数
    url = "https://data.stats.gov.cn/easyquery.htm?cn=C01"
    params = {
        "m": "QueryData",  # 数据查询
        "dbcode": "hgnd",  # 数据库代码(年度数据库为 hgnd)
        "rowcode": "zb",  # 行代码
        "colcode": "sj",  # 列代码
        "wds": "[]",  # 查询条件
        "dfwds": '[{"wdcode":"zb","valuecode":"A0407"}]',  # 指标代码
        "k1": str(int(round(time.time() * 1000))),
        "h": 1
    }

    # 建立一个 Session
    session = requests.session()

    # 第一次请求
    response = session.get(url, params=params, headers=headers)

    # 检查请求状态
    if response.status_code != 200:
        print(f"第一次请求失败,状态码: {response.status_code}")
        return None

    # 修改 dfwds 字段内容
    params['dfwds'] = '[{"wdcode":"sj","valuecode":"LAST20"}]'
    params['k1'] = str(int(round(time.time() * 1000)))
    del params['h']

    # 第二次请求
    response = session.get(url, params=params, headers=headers)

    # 检查请求状态
    if response.status_code != 200:
        print(f"第二次请求失败,状态码: {response.status_code}")
        return None

    # 返回 JSON 数据
    return response.json()

# 循环检查 wdnodes 的数组长度是否为 20
while True:
    print("开始执行脚本...")
    data = fetch_data()

    if data is None:
        print("数据获取失败,重试中...")
        time.sleep(2)  # 等待 2 秒后重试
        continue

    # 检查 wdnodes 的长度
    wdnodes = data.get("returndata", {}).get("wdnodes", [])
    col_headers = wdnodes[0].get("nodes", [])
    if len(col_headers) != 20:
        print(f"col_headers 数组长度为 {len(col_headers)},不符合要求,重新执行脚本...")
        continue

    # 数据长度符合要求,进行数据处理
    print("wdnodes 数组长度正确,开始处理数据...")
    break

# 提取 `wdnodes` 中的第一列(名称)和列头信息
first_col = [node.get("cname", "") for node in wdnodes[0].get("nodes", [])]
col_headers = [node.get("cname", "") for node in wdnodes[1].get("nodes", [])]

# 提取 `datanodes` 数据
datanodes = data.get("returndata", {}).get("datanodes", [])

# 根据 `datanodes` 和列头长度组织数据
rows = len(first_col)  # 行数
cols = len(col_headers)  # 列数

# 创建一个空列表用于存储结果
result = [["" for _ in range(cols + 1)] for _ in range(rows)]

# 填充第一列(名称)
for i in range(rows):
    result[i][0] = first_col[i]

# 填充数据列
for node in datanodes:
    row_code = node.get("wds", [])[0].get("valuecode", "")  # 行代码
    col_code = node.get("wds", [])[1].get("valuecode", "")  # 列代码
    value = node.get("data", {}).get("data", "")

    # 根据代码找到对应的行和列索引
    row_index = next((i for i, n in enumerate(wdnodes[0]["nodes"]) if n.get("code") == row_code), None)
    col_index = next((j for j, n in enumerate(wdnodes[1]["nodes"]) if n.get("code") == col_code), None)

    if row_index is not None and col_index is not None:
        # 四舍五入保留整数
        try:
            value = round(float(value)) if value != "" else ""
        except ValueError:
            value = ""  # 如果无法转换为数值,置为空
        result[row_index][col_index + 1] = value

# 转换为 DataFrame 并添加列名
df = pd.DataFrame(result, columns=["名称"] + col_headers)

# 保存为 CSV 文件
output_file = "统计数据.csv"
df.to_csv(output_file, index=False, encoding="utf-8-sig")
print(f"数据已保存到 {output_file}")

3、数据格式

1.生成的csv文件如下

在这里插入图片描述

4、总结

此python代码已尽可能通用,但可能还需要根据具体的业务需求,对代码进行微调。在使用过程中可以根据具体的业务需要对代码进行调整。

标签:code,get,Python,data,wdnodes,爬取,headers,数据,col
From: https://blog.csdn.net/shy_1762538422/article/details/143912138

相关文章

  • 基于yolov10的草莓成熟度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python
     更多目标检测和图像分类识别项目可看我主页其他文章功能演示:yolov10,草莓成熟度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python】_哔哩哔哩_bilibili(一)简介基于yolov10的草莓成熟度检测系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训练好的......
  • mysql数据库约束
    数据库会自动对数据的合法性进行检查的一系列机制,目的是为了防止被插入/修改一些非法的数据提供了一下约束notnull指示某列不能存储null值unique保证某列的每行必须有唯一值default规定没有给列赋值时的默认值primarykeynotnull和unique的结合,确保某列有唯一标识forei......
  • 大数据调度组件之Apache DolphinScheduler
    ApacheDolphinScheduler是一个分布式易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。主要特性易于部署,提供四种部署方式,包括Standalone、Cluster、Docker和Kubernetes易于使用,可以通过四种方式创......
  • python 自定义数据分页
    defpaginate_data(data_list,size_page,current_page):"""数据分页函数:paramdata_list:list,数据列表:paramsize_page:int,每页的数量:paramcurrent_page:int,当前页码:return:tuple,(总页数,当前页码,当前页的数据列表)"""......
  • python毕设采购系统的设计与实现程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于采购系统的研究,现有研究多集中在企业资源管理系统(ERP)中的采购模块或者特定行业(如制造业)的采购流程优化方面。专门针对以Python为......
  • Python语法进阶与虚拟机安装详解
    Python作为一种高级编程语言,以其简洁的语法和强大的功能,在数据科学、人工智能、Web开发等多个领域得到了广泛应用。为了深入理解Python的进阶语法,并在一个隔离的环境中进行实践,虚拟机安装成为了一个不错的选择。本文将详细介绍Python的进阶语法以及如何在虚拟机中安装Python......
  • 用Python语言,从键盘上输入一个1到365的数字,判断该数字是第几个月的第几天。(不需要考虑
     从键盘上输入一个1到365的数字,判断该数字是第几个月的第几天。(不需要考虑闰年的情况)例:从键盘输入60输出:第3个月的第1天{31,28,31,30,31,30,31,31,30,31,30,31}importsysday=int(input("请输入天数:"))ifday<1orday>365:print("输入的数据不合法")......
  • 大数据学习资料
    ......
  • C# 开发的数据采集及云端监控系统
    前言推荐C#语言开发的堤坝渗透地质数据采集及云端监控系统。希望本文能够为大家提供有价值的信息和参考。项目介绍使用数十个.NET客户端控制硬件设备进行工作,采集数据并进行处理。管理人员通过Android应用实时控制各设备的工作。该作品在第十二届中国研究生电子设计竞赛......
  • Redis中常见的数据类型及其应用场景Ib
    五种常见数据类型Redis中的数据类型指的是value存储的数据类型,key都是以String类型存储的,value根据场景需要,可以以String、List等类型进行存储。各数据类型介绍:Redis数据类型对应的底层数据结构String类型的应用场景常用命令存放键值:setkeyvalue[EXseconds][PX......