中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

國家統計局數據采集過程有哪些

發布時間:2021-10-14 14:31:31 來源:億速云 閱讀:169 作者:iii 欄目:編程語言

這篇文章主要介紹“國家統計局數據采集過程有哪些”,在日常操作中,相信很多人在國家統計局數據采集過程有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”國家統計局數據采集過程有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

采集過程

采集各種公開數據的第一步就是分析網頁。

國家統計局數據采集過程有哪些

上面的圖是國家統計局年度數據的界面。 左邊是數據分類的樹形菜單,右邊是每個菜單點擊之后顯示的數據,可以設置年份來過濾數據。

采集數據分類樹

根據頁面的情況,首先,我們需要采集樹形菜單中的數據,然后再根據菜單的分類來依次采集右邊的數據。 這樣可以避免采集的遺漏。

爬蟲采集數據一般有 2 種情況:

  • 采集 html 頁面,然后分析其中的結構,提取出數據

  • 查看是否存在獲取數據的 API,直接從 API 中提取數據

通過分析網頁的加載過程,發現國際統計局的數據是有 API 的,這就節省了很多時間。

API 信息如下:

host: "https://data.stats.gov.cn/easyquery.htm"
method: POST
params:  id=zb&dbcode=hgnd&wdcode=zb&m=getTree

通過 python 的 requests 庫模擬 POST 請求就可以獲取到樹形菜單中的數據了。

def init_tree(tree_data_path):
    data = get_tree_data()
    with open(tree_data_path, "wb") as f:
        pickle.dump(data, f)


def get_tree_data(id="zb"):
    r = requests.post(f"{host}?id={id}&dbcode=hgnd&wdcode=zb&m=getTree", verify=False)
    logging.debug("access url: %s", r.url)
    data = r.json()

    for node in data:
        if node["isParent"]:
            node["children"] = get_tree_data(node["id"])
        else:
            node["children"] = []

    return data

直接調用上面的 init_tree 函數即可,樹形菜單會以 json 格式序列化到 tree_data_path 中。

序列化的目的是為了后面采集數據時可以反復使用,不用每次都去采集這個樹形菜單。(畢竟菜單是基本不變的)

根據分類采集數據

有了分類的菜單,下一步就是采集具體的數據。 同樣,通過分析網頁,數據也是有 API 的,不用采集 html 頁面再提取數據。

host: "https://data.stats.gov.cn/easyquery.htm"
method: GET
params: 參數有變量,具體參見代碼

采集數據稍微復雜一些,不像采集樹形菜單那樣訪問一次 API 即可,而是遍歷樹形菜單,根據菜單的信息訪問 API。

# -*- coding: utf-8 -*-

import logging
import os
import pickle
import time

import pandas as pd
import requests

host = "https://data.stats.gov.cn/easyquery.htm"
tree_data_path = "./tree.data"
data_dir = "./data"


def data(sj="1978-"):
    tree_data = []
    with open(tree_data_path, "rb") as f:
        tree_data = pickle.load(f)

    traverse_tree_data(tree_data, sj)


def traverse_tree_data(nodes, sj):
    for node in nodes:
        # 葉子節點上獲取數據
        if node["isParent"]:
            traverse_tree_data(node["children"], sj)
        else:
            write_csv(node["id"], sj)


def write_csv(nodeId, sj):
    fp = os.path.join(data_dir, nodeId + ".csv")
    # 文件是否存在, 如果存在, 不爬取
    if os.path.exists(fp):
        logging.info("文件已存在: %s", fp)
        return

    statData = get_stat_data(sj, nodeId)
    if statData is None:
        logging.error("NOT FOUND data for %s", nodeId)
        return

    # csv 數據
    csvData = {"zb": [], "value": [], "sj": [], "zbCN": [], "sjCN": []}
    for node in statData["datanodes"]:
        csvData["value"].append(node["data"]["data"])
        for wd in node["wds"]:
            csvData[wd["wdcode"]].append(wd["valuecode"])

    # 指標編碼含義
    zbDict = {}
    sjDict = {}
    for node in statData["wdnodes"]:
        if node["wdcode"] == "zb":
            for zbNode in node["nodes"]:
                zbDict[zbNode["code"]] = {
                    "name": zbNode["name"],
                    "cname": zbNode["cname"],
                    "unit": zbNode["unit"],
                }

        if node["wdcode"] == "sj":
            for sjNode in node["nodes"]:
                sjDict[sjNode["code"]] = {
                    "name": sjNode["name"],
                    "cname": sjNode["cname"],
                    "unit": sjNode["unit"],
                }

    # csv 數據中加入 zbCN 和 sjCN
    for zb in csvData["zb"]:
        zbCN = (
            zbDict[zb]["cname"]
            if zbDict[zb]["unit"] == ""
            else zbDict[zb]["cname"] + "(" + zbDict[zb]["unit"] + ")"
        )
        csvData["zbCN"].append(zbCN)

    for sj in csvData["sj"]:
        csvData["sjCN"].append(sjDict[sj]["cname"])

    # write csv file
    df = pd.DataFrame(
        csvData,
        columns=["sj", "sjCN", "zb", "zbCN", "value"],
    )
    df.to_csv(fp, index=False)


def get_stat_data(sj, zb):
    payload = {
        "dbcode": "hgnd",
        "rowcode": "zb",
        "m": "QueryData",
        "colcode": "sj",
        "wds": "[]",
        "dfwds": '[{"wdcode":"zb","valuecode":"'
        + zb
        + '"},{"wdcode":"sj","valuecode":"'
        + sj
        + '"}]',
    }

    r = requests.get(host, params=payload, verify=False)
    logging.debug("access url: %s", r.url)
    time.sleep(2)

    logging.debug(r.text)
    resp = r.json()
    if resp["returncode"] == 200:
        return resp["returndata"]
    else:
        logging.error("error: %s", resp)
        return None

代碼說明:

  1. tree_data_path = "./tree.data" : 這個是第一步序列化出的樹形菜單數據

  2. 采集的數據按照樹形菜單中的每個菜單的編號生成相應的 csv

  3. 樹形菜單的每個葉子節點才有數據,非葉子節點不用采集

  4. 調用 data 函數來采集數據,默認是從 1978 年的數據開始采集的

采集結果

本次采集的結果有 1917 個不同種類的數據。

到此,關于“國家統計局數據采集過程有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扎赉特旗| 临夏市| 沙雅县| 健康| 嘉祥县| 遂昌县| 乐东| 儋州市| 中超| 长岛县| 易门县| 东海县| 鄯善县| 盐山县| 三门县| 禹城市| 且末县| 吉木萨尔县| 烟台市| 孟州市| 津市市| 化州市| 海阳市| 乾安县| 上栗县| 阿尔山市| 开鲁县| 天水市| 隆林| 灵台县| 项城市| 嘉善县| 视频| 和平县| 延寿县| 青河县| 德州市| 洛浦县| 普陀区| 宁远县| 巴楚县|