本文共 2711 字,大约阅读时间需要 9 分钟。
**
**
目标网站: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:09import randomimport csvimport requestsimport osimport jsonhead = ["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()
运行结果
总结:一定要细心观察,不然小错误也要思考一会儿的。转载地址:http://xhqzi.baihongyu.com/