1. 程式人生 > >爬 NationalData ,雖然可以直接下,但還是爬一下吧

爬 NationalData ,雖然可以直接下,但還是爬一下吧

.cn char 獲取 圖片 刪除 quest mssql stats pen

爬取的是分省月度數據,2017年的,包括:居民消費價格指數,食品煙酒類居民消費價格指數,衣著類居民消費價格指數,居住類居民消費價格指數,生活用品及服務類居民消費價格指數,交通和通信類居民消費價格指數,教育文化和娛樂類居民消費價格指數,醫療保健類居民消費價格指數,其他用品和服務類居民消費價格指數。


打開網站,地區數據-----分省月度數據,如圖:

技術分享圖片


按F12,在按F5會出現3個請求url:

1:http://data.stats.gov.cn/easyquery.htm

2:http://data.stats.gov.cn/easyquery.htm?m=getOtherWds&dbcode=fsyd&rowcode=reg&colcode=sj&wds=[]&k1=1516511359046

3:http://data.stats.gov.cn/easyquery.htm?m=QueryData&dbcode=fsyd&rowcode=reg&colcode=sj&wds=[{"wdcode":"zb","valuecode":"A01010101"}]&dfwds=[]&k1=1516511359249

這三個請求url都有用,但這個爬蟲只用了兩個:2,3


2的效果圖:

技術分享圖片

3的效果圖:

技術分享圖片


代碼如下:

import urllib
from urllib import request
from json import loads

import pymssql

# 發起請求
def getRequestBody(url):
return urllib.request.urlopen(url).read().decode(‘utf8‘)
# 獲取指標類型
def getTarget(url):
body = getRequestBody(url)
print(‘body‘, body)
dicts = loads(body)
return dicts[‘returndata‘]

url = ‘http://data.stats.gov.cn/easyquery.htm?m=getOtherWds&dbcode=fsyd&rowcode=reg&colcode=sj&wds=[]&k1=1516507560165‘

targetList_returnData = getTarget(url) # list
print(‘targetList_returnData‘,targetList_returnData)
for targetIndex_returnData in range(len(targetList_returnData)):
targetDict_returnData = dict(targetList_returnData[targetIndex_returnData]) # dict
targetList_nodes = targetDict_returnData[‘nodes‘] # list
# 請求無法得到,但卻有,只能硬來了
targetList_nodes.append({‘code‘: ‘A01010106‘, ‘name‘: ‘交通和通信類居民消費價格指數(上年同月=100)‘, ‘sort‘: ‘1‘})
targetList_nodes.append({‘code‘: ‘A01010107‘, ‘name‘: ‘教育文化和娛樂類居民消費價格指數(上年同月=100)‘, ‘sort‘: ‘1‘})
targetList_nodes.append({‘code‘: ‘A01010108‘, ‘name‘: ‘醫療保健類居民消費價格指數(上年同月=100)‘, ‘sort‘: ‘1‘})
targetList_nodes.append({‘code‘: ‘A01010109‘, ‘name‘: ‘其他用品和服務類居民消費價格指數(上年同月=100)‘, ‘sort‘: ‘1‘})
print(‘targetList_nodes‘,targetList_nodes)
for targetIndex_nodes in range(len(targetList_nodes)):
targetDict_nodes = dict(targetList_nodes[targetIndex_nodes]) # dict
print(targetDict_nodes[‘code‘],targetDict_nodes[‘name‘])
#
url1 = ‘http://data.stats.gov.cn/easyquery.htm?m=QueryData&dbcode=fsyd&rowcode=reg&colcode=sj‘ \
‘&wds=[{"wdcode":"zb","valuecode":"%s"}]&dfwds=[]‘ %(targetDict_nodes[‘code‘])
body1 = getRequestBody(url1)
print(‘body1‘,body1)
dictAll = loads(body1)
# 獲取wdnodes鍵的name,以name當表名
dataList2 = dictAll[‘returndata‘][‘wdnodes‘]
dataList2.pop()
name = dataList2[0][‘nodes‘][0][‘cname‘]
if name.find(‘(‘) != -1:
name = name[:name.find(‘(‘)] + ‘2017‘
print(name)
# 獲取wdnodes鍵的地區
regionList = dataList2[1][‘nodes‘]
# 獲取datanodes鍵的內容
dataList1 = dictAll[‘returndata‘][‘datanodes‘]
# 控制遍歷,以刪除2016年12月的數據,只要2017年的數據
index = 1
# 控制插入的地區
region = 0
# 存儲具體數據
data = []
for dataIndex1 in range(len(dataList1)):
if index <= 12:
# 獲取‘datanodes’的指數數據
data_f = dataList1[dataIndex1][‘data‘][‘data‘]
print(data_f,index)
data.append(data_f)
conn = pymssql.connect(host=‘localhost‘, user=‘sa‘, password=‘123456c‘, database=‘NationalData‘, charset=‘utf8‘)
cur = conn.cursor()
if index == 12:
print(regionList[region][‘cname‘])
sql =‘‘‘insert into {} values(‘{}‘,{},{},{},{},{},{},{},{},{},{},{},{});‘‘‘\
.format(name,regionList[region][‘cname‘],data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10],data[11])
region += 1
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
elif index == 13:
data = []
index = 0
index += 1
break

數據庫有如下表:
技術分享圖片

結果:

技術分享圖片

爬 NationalData ,雖然可以直接下,但還是爬一下吧