您好,登錄后才能下訂單哦!
這篇文章主要介紹“國家統(tǒng)計局?jǐn)?shù)據(jù)采集過程有哪些”,在日常操作中,相信很多人在國家統(tǒng)計局?jǐn)?shù)據(jù)采集過程有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”國家統(tǒng)計局?jǐn)?shù)據(jù)采集過程有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
采集各種公開數(shù)據(jù)的第一步就是分析網(wǎng)頁。
上面的圖是國家統(tǒng)計局年度數(shù)據(jù)的界面。 左邊是數(shù)據(jù)分類的樹形菜單,右邊是每個菜單點擊之后顯示的數(shù)據(jù),可以設(shè)置年份來過濾數(shù)據(jù)。
根據(jù)頁面的情況,首先,我們需要采集樹形菜單中的數(shù)據(jù),然后再根據(jù)菜單的分類來依次采集右邊的數(shù)據(jù)。 這樣可以避免采集的遺漏。
爬蟲采集數(shù)據(jù)一般有 2 種情況:
采集 html 頁面,然后分析其中的結(jié)構(gòu),提取出數(shù)據(jù)
查看是否存在獲取數(shù)據(jù)的 API,直接從 API 中提取數(shù)據(jù)
通過分析網(wǎng)頁的加載過程,發(fā)現(xiàn)國際統(tǒng)計局的數(shù)據(jù)是有 API 的,這就節(jié)省了很多時間。
API 信息如下:
host: "https://data.stats.gov.cn/easyquery.htm" method: POST params: id=zb&dbcode=hgnd&wdcode=zb&m=getTree
通過 python 的 requests 庫模擬 POST 請求就可以獲取到樹形菜單中的數(shù)據(jù)了。
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
直接調(diào)用上面的 init_tree 函數(shù)即可,樹形菜單會以 json 格式序列化到 tree_data_path 中。
序列化的目的是為了后面采集數(shù)據(jù)時可以反復(fù)使用,不用每次都去采集這個樹形菜單。(畢竟菜單是基本不變的)
有了分類的菜單,下一步就是采集具體的數(shù)據(jù)。 同樣,通過分析網(wǎng)頁,數(shù)據(jù)也是有 API 的,不用采集 html 頁面再提取數(shù)據(jù)。
host: "https://data.stats.gov.cn/easyquery.htm" method: GET params: 參數(shù)有變量,具體參見代碼
采集數(shù)據(jù)稍微復(fù)雜一些,不像采集樹形菜單那樣訪問一次 API 即可,而是遍歷樹形菜單,根據(jù)菜單的信息訪問 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: # 葉子節(jié)點上獲取數(shù)據(jù) 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 數(shù)據(jù) 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"]) # 指標(biāo)編碼含義 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 數(shù)據(jù)中加入 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
代碼說明:
tree_data_path = "./tree.data" : 這個是第一步序列化出的樹形菜單數(shù)據(jù)
采集的數(shù)據(jù)按照樹形菜單中的每個菜單的編號生成相應(yīng)的 csv
樹形菜單的每個葉子節(jié)點才有數(shù)據(jù),非葉子節(jié)點不用采集
調(diào)用 data 函數(shù)來采集數(shù)據(jù),默認(rèn)是從 1978 年的數(shù)據(jù)開始采集的
本次采集的結(jié)果有 1917 個不同種類的數(shù)據(jù)。
到此,關(guān)于“國家統(tǒng)計局?jǐn)?shù)據(jù)采集過程有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。