**
Python爬取国家数据居民消费价格分类指数中2019年12个月36大中城市居民消费和商品零售价格指数
**
目标网站:http://data.stats.gov.cn/index.htm
http://data.stats.gov.cn/tablequery.htm?code=AA0108
分析浏览器的数据来源知道数据从脚本传递过来的,所以知道数据存放的浏览器地址。
http://data.stats.gov.cn/tablequery.htm?m=QueryData&code=AA0106&wds=[{
“wdcode”: “sj”, “valuecode”: “201901” }]
观察可知道valuecode为月份,只需改变月数就可以爬取2019年整年的36大中城市居民消费和商品零售价格指数数据。
我的这个demo只是爬取2019年12个月的,还可改进同时爬取多个年份的所有数据。
#encoding=utf-8
#@Project filename:PythonDemo Crawl-Popluation
#@IDE :PyCharm
#@Author :ganxiang
#@Date :2020/02/05 17:09
import random
import csv
import requests
import os
import json
head = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
]
headers={'User-Agent':random.choice(head)}
def mkdir ():#当前目录下创建存储文件夹
root = os.getcwd()
print(root)
ss = "36CityConsumption"
floder = os.path.exists("36CityConsumption")
if not floder:
os.mkdir("36CityConsumption")
print('创建%s成功!' % ss)
else:
print('创建%s失败!' % ss)
def request_url():#请求网页并存储数据
d = '[{"wdcode":"sj","valuecode":"201912"}]' #valuecode为月季度,可修改1~12月
url_dd = []
for j in range(1,13):
if j<10:
dd = [{
"wdcode": "sj", "valuecode": "20190" + str(j)
}]
dd=json.dumps(dd)#必须将列表中的josn文件转换为字符串,在这里思考了许久,一直找不到get请求的错误,😊happy!
else:
dd = [{
"wdcode": "sj", "valuecode": "2019" + str(j)
}]
dd=json.dumps(dd)
url_dd.append(dd)
# print(url_dd)
#思考通过改变valuecode的键值爬取12月份的数据,并存储为一个文件夹下的12个文件
n=1
for q in url_dd:
print(q)
url = 'http://data.stats.gov.cn/tablequery.htm?m=QueryData&code=AA0106&wds={}'.format(q)
print(url)
res = requests.get(url,headers=headers).json()
print(res)
print(res['exceltable'])
i = 0#计数列表开始存储的元素
l=[]#存储所有的爬取的字段
with open('./36CityConsumption/%s月36CityConsumption.csv'%n,'w',newline='',encoding='gb18030') as f:
header =['地区','居民消费价格指数当月(上年同月=100)','居民消费价格指数累计(上年同期=100)',
'商品零售价格指数当月(上年同月=100)','商品零售价格指数累计(上年同期=100)']
w = csv.writer(f)
w.writerow(header)
for data in res['exceltable']:
if i>6:
l.append(data['data'])
i+=1
print(i)#通过i=192的大小来确定200
for a in range(0,200,5):#每次取出五个进行按行写入CSV文件
# print(a)
w.writerow(l[a:a+5])
n+=1
print(n)
if __name__ == '__main__':
mkdir()
request_url()
运行结果
总结:一定要细心观察,不然小错误也要思考一会儿的。