参考链接:使用Python和阿里云API接口获取互联网数据
了解阿里云网站布局及API接口
首先,我们登录阿里云官网查看其布局,我们会爱上这个网站。其中很多前沿新知,我们也可以通过其提供的API接口来练手我们刚入门的python。可以直接通过自己的支付宝账号来登录阿里云。
![8b548b55c29586bab84e5907b5ba84d6.png](https://i-blog.csdnimg.cn/blog_migrate/3358b70b41cf98d63451d0c4190b36c7.jpeg)
这是阿里云的首页
我们登录它,来到云市场API服务。
![0ce5dbabee10d731be52d6be6b8f09a0.png](https://i-blog.csdnimg.cn/blog_migrate/44f2e4e47ea749c9cdd10593eb137650.jpeg)
API服务位置示意图
在这里我们会发现很多有趣的内容,比如说天气、物流查询、身份证识别、银行卡识别、表格识别等等。
![4ba125d2d842cab65faaf14734fefcf1.png](https://i-blog.csdnimg.cn/blog_migrate/d7f7154649a0977eb310c026c78ed095.jpeg)
阿里云列举的API接口
以天气为例,点击天气查询栏的进入选购,进入天气查询的API接口。
我们会发现阿里云平台为我们提供了丰富的获取数据的入口。
![7a421644968c0c0af5ce6d18df441529.png](https://i-blog.csdnimg.cn/blog_migrate/41aa3d496535083c4a318cc142cf1535.jpeg)
数据源
点击第一个来练手,毕竟一分钱也不用花,可以点击购买,购买后我们会获得一个AppCode,这个码比较重要,在我们调取API接口信息的时候需要用到,在买家中心的管理控制台页面可以查看到自己购买的商品信息。
![ffffa913f91f5504c6bd7fe4dd3b76be.png](https://i-blog.csdnimg.cn/blog_migrate/47a91b9197f842a4cffb132340e88177.jpeg)
![c92ba1ed2da0f773c08259493988ea52.png](https://i-blog.csdnimg.cn/blog_migrate/d760eca391b08da59fa439ed6ca77e54.jpeg)
我们点击免费气象服务连接进入详情页。
在这里我们可以看到左边栏目给出了我们可以调用的信息,右边栏给出了我们调取的url地址,请求方式,返回类型。
![01ea16b342cdeee10b1fd099c2593018.png](https://i-blog.csdnimg.cn/blog_migrate/0cbb65deba1ac594e8fb6d17f83a8121.jpeg)
不着急,我们继续看,后边我们看到其列出了请求参数,和代码示例。
这样我们是不是就可以照葫芦画瓢,不用心虚担心花了钱调取不到内容了吧。
这个简单的练手内容其实也不用一分钱。
后面熟练了可以花钱去调取其他更有意义的接口数据来做分析。
请求参数中cityid、token我们可以通过产品说明页的链接下载下来查看感兴趣的城市
第一步:找到右上角的控制台;
![79292b6208480b439b9f6413f5328730.png](https://i-blog.csdnimg.cn/blog_migrate/1cfa3d131623a18507f5d5d7c649e31b.jpeg)
第二步:进入控制台后点击左侧第一个“产品与服务”,会看见其中有“应用服务”一项,点击里面的“API 网关”;
![08aa9534da64451ddc1da7857c25fd80.png](https://i-blog.csdnimg.cn/blog_migrate/bd07f891f3e069e585138e40ea70fd52.jpeg)
第三步:进入“API 网关”后点击“调用 API”选择“已购买 API” 后可以查看需要的分接口的API 了, 不管您是在哪里购买, 记得一定要选择“华北 2(北京)”哦!
![eacca82c88dfffca20c2a5064aeb3f9b.png](https://i-blog.csdnimg.cn/blog_migrate/bdd2843937b85137f54dee5f00a23e63.jpeg)
![8b93b13938a0c3af6ea418e96a964227.png](https://i-blog.csdnimg.cn/blog_migrate/4fae1667517890ff46ad320a1cae2888.png)
第四步:往下拉就可以看到“token”了,开始使用您的 API 吧!
![dbc46af7fddc3f3d1842997477ccda25.png](https://i-blog.csdnimg.cn/blog_migrate/bc133ff9cfa298789779019f3ca5b4b0.png)
import requests
host='http://freecityid.market.alicloudapi.com'
path='/whapi/json/alicityweather/briefforecast3days'
method = 'POST'
appcode = '自己的appcode'
querys = ''
url = host + path
cityId = '2'
token = '自己的token'
payload={'cityId':cityId,'token':token}
headers={'Authorization': 'APPCODE {}'.format(appcode)}
r = requests.post(url, params=payload, headers=headers)
print(r.content)
输出
D:applicationAnaconda3python.exe F:/test/venv/learning/test.py
b'{"code":0,"data":{"city":{"cityId":2,"counname":"xe4xb8xadxe5x9bxbd","ianatimezone":"Asia/Shanghai","name":"xe5x8cx97xe4xbaxacxe5xb8x82","pname":"xe5x8cx97xe4xbaxacxe5xb8x82","timezone":"8"},"forecast":[{"conditionDay":"xe9x98xb4","conditionIdDay":"2","conditionIdNight":"31","conditionNight":"xe5xa4x9axe4xbax91","predictDate":"2019-03-09","tempDay":"12","tempNight":"2","updatetime":"2019-03-09 11:05:00","windDegreesDay":"0","windDegreesNight":"45","windDirDay":"xe5x8cx97xe9xa3x8e","windDirNight":"xe4xb8x9cxe5x8cx97xe9xa3x8e","windLevelDay":"3","windLevelNight":"3"},{"conditionDay":"xe5xa4x9axe4xbax91","conditionIdDay":"1","conditionIdNight":"31","conditionNight":"xe5xa4x9axe4xbax91","predictDate":"2019-03-10","tempDay":"13","tempNight":"2","updatetime":"2019-03-09 11:05:00","windDegreesDay":"180","windDegreesNight":"0","windDirDay":"xe5x8dx97xe9xa3x8e","windDirNight":"xe5x8cx97xe9xa3x8e","windLevelDay":"3","windLevelNight":"3"},{"conditionDay":"xe6x99xb4","conditionIdDay":"0","conditionIdNight":"30","conditionNight":"xe6x99xb4","predictDate":"2019-03-11","tempDay":"16","tempNight":"2","updatetime":"2019-03-09 11:05:00","windDegreesDay":"315","windDegreesNight":"0","windDirDay":"xe8xa5xbfxe5x8cx97xe9xa3x8e","windDirNight":"xe5x8cx97xe9xa3x8e","windLevelDay":"3-4","windLevelNight":"3-4"}]},"msg":"success","rc":{"c":0,"p":"success"}}'
Process finished with exit code 0
这都是什么呢 ,别着急 ,官方文档说返回的是json文件,因此我们导入json包,用 json 包的字符串处理功能(loads)解析返回内容,结果存入content_json
。
import json
content_json=json.loads(r.content)
print(content_json)
输出
D:applicationAnaconda3python.exe F:/test/venv/learning/test.py
{'code': 0, 'data': {'city': {'cityId': 2, 'counname': '中国', 'ianatimezone': 'Asia/Shanghai', 'name': '北京市', 'pname': '北京市', 'timezone': '8'}, 'forecast': [{'conditionDay': '阴', 'conditionIdDay': '2', 'conditionIdNight': '31', 'conditionNight': '多云', 'predictDate': '2019-03-09', 'tempDay': '12', 'tempNight': '2', 'updatetime': '2019-03-09 11:05:00', 'windDegreesDay': '0', 'windDegreesNight': '45', 'windDirDay': '北风', 'windDirNight': '东北风', 'windLevelDay': '3', 'windLevelNight': '3'}, {'conditionDay': '多云', 'conditionIdDay': '1', 'conditionIdNight': '31', 'conditionNight': '多云', 'predictDate': '2019-03-10', 'tempDay': '13', 'tempNight': '2', 'updatetime': '2019-03-09 11:05:00', 'windDegreesDay': '180', 'windDegreesNight': '0', 'windDirDay': '南风', 'windDirNight': '北风', 'windLevelDay': '3', 'windLevelNight': '3'}, {'conditionDay': '晴', 'conditionIdDay': '0', 'conditionIdNight': '30', 'conditionNight': '晴', 'predictDate': '2019-03-11', 'tempDay': '16', 'tempNight': '2', 'updatetime': '2019-03-09 11:05:00', 'windDegreesDay': '315', 'windDegreesNight': '0', 'windDirDay': '西北风', 'windDirNight': '北风', 'windLevelDay': '3-4', 'windLevelNight': '3-4'}]}, 'msg': 'success', 'rc': {'c': 0, 'p': 'success'}}
Process finished with exit code 0
我们看到这是一个嵌套字典,提取data
数据:content_json['data']
import json
content_json=json.loads(r.content)
print(content_json['data'])
同样的,获取forecast
数据:content_json['data']['forecast']
import json
content_json=json.loads(r.content)
print(content_json['data'])
print(content_json['data']['forecast'])
输出
D:applicationAnaconda3python.exe F:/test/venv/learning/test.py
{'city': {'cityId': 2, 'counname': '中国', 'ianatimezone': 'Asia/Shanghai', 'name': '北京市', 'pname': '北京市', 'timezone': '8'}, 'forecast': [{'conditionDay': '阴', 'conditionIdDay': '2', 'conditionIdNight': '31', 'conditionNight': '多云', 'predictDate': '2019-03-09', 'tempDay': '12', 'tempNight': '2', 'updatetime': '2019-03-09 11:05:00', 'windDegreesDay': '0', 'windDegreesNight': '45', 'windDirDay': '北风', 'windDirNight': '东北风', 'windLevelDay': '3', 'windLevelNight': '3'}, {'conditionDay': '多云', 'conditionIdDay': '1', 'conditionIdNight': '31', 'conditionNight': '多云', 'predictDate': '2019-03-10', 'tempDay': '13', 'tempNight': '2', 'updatetime': '2019-03-09 11:05:00', 'windDegreesDay': '180', 'windDegreesNight': '0', 'windDirDay': '南风', 'windDirNight': '北风', 'windLevelDay': '3', 'windLevelNight': '3'}, {'conditionDay': '晴', 'conditionIdDay': '0', 'conditionIdNight': '30', 'conditionNight': '晴', 'predictDate': '2019-03-11', 'tempDay': '16', 'tempNight': '2', 'updatetime': '2019-03-09 11:05:00', 'windDegreesDay': '315', 'windDegreesNight': '0', 'windDirDay': '西北风', 'windDirNight': '北风', 'windLevelDay': '3-4', 'windLevelNight': '3-4'}]}
[{'conditionDay': '阴', 'conditionIdDay': '2', 'conditionIdNight': '31', 'conditionNight': '多云', 'predictDate': '2019-03-09', 'tempDay': '12', 'tempNight': '2', 'updatetime': '2019-03-09 11:05:00', 'windDegreesDay': '0', 'windDegreesNight': '45', 'windDirDay': '北风', 'windDirNight': '东北风', 'windLevelDay': '3', 'windLevelNight': '3'}, {'conditionDay': '多云', 'conditionIdDay': '1', 'conditionIdNight': '31', 'conditionNight': '多云', 'predictDate': '2019-03-10', 'tempDay': '13', 'tempNight': '2', 'updatetime': '2019-03-09 11:05:00', 'windDegreesDay': '180', 'windDegreesNight': '0', 'windDirDay': '南风', 'windDirNight': '北风', 'windLevelDay': '3', 'windLevelNight': '3'}, {'conditionDay': '晴', 'conditionIdDay': '0', 'conditionIdNight': '30', 'conditionNight': '晴', 'predictDate': '2019-03-11', 'tempDay': '16', 'tempNight': '2', 'updatetime': '2019-03-09 11:05:00', 'windDegreesDay': '315', 'windDegreesNight': '0', 'windDirDay': '西北风', 'windDirNight': '北风', 'windLevelDay': '3-4', 'windLevelNight': '3-4'}]
Process finished with exit code 0
导入pandas
,利用DataFrame
将数据可视化输出:
import pandas as pd
df=pd.DataFrame(content_json['data']['forecast'])
print(df)
输出
D:applicationAnaconda3python.exe F:/test/venv/learning/test.py
conditionDay conditionIdDay ... windLevelDay windLevelNight
0 阴 2 ... 3 3
1 多云 1 ... 3 3
2 晴 0 ... 3-4 3-4
这样,我们第一步工作做完了。如果我们想获取更多的城市天气信息,采用一个个去输入城市id一个个运行显然是违背了利用计算机的强大来简化我们工作的初衷。
必须利用计算机来让我们可以偷个懒喝杯茶还能获取满意的结果才行,我们的前辈们告诉我们可以通过定义一个函数来循环运行我们的测试代码,从而实现一次获取多个城市的天气数据。
代码如下:
import requests
host='http://freecityid.market.alicloudapi.com'
path='/whapi/json/alicityweather/briefforecast3days'
method = 'POST'
appcode = '1e54cd988a7b471db608da14caae3263'
querys = ''
url = host + path
cityId = '2'
token = '677282c2f1b3d718152c4e25ed434bc4'
payload={'cityId':cityId,'token':token}
headers={'Authorization': 'APPCODE {}'.format(appcode)}
r = requests.post(url, params=payload, headers=headers)
import json
content_json=json.loads(r.content)
#print(content_json['data'])
#print(content_json['data']['forecast'])
import pandas as pd
df=pd.DataFrame(content_json['data']['forecast'])
#print(df)
def get_df(cityId,cityname_dict, appcode):
url='http://freecityid.market.alicloudapi.com/whapi/json/alicityweather/briefforecast3days'
payload = {'cityId': cityId, 'token': token}
headers = {'Authorization': 'APPCODE {}'.format(appcode)}
r = requests.post(url, params=payload, headers=headers)
content_json = json.loads(r.content)
df = pd.DataFrame(content_json['data']['forecast'])
df['cityname'] = cityname_dict[cityId]
return df
我们为函数增加了一个输入参数,即cityname_dict
。
它是一个字典,每一项分别包括城市代码,和对应的城市名称。
根据我们输入的城市代码,函数就可以自动在结果数据框中添加一个列,注明对应的是哪个城市。
当我们获取多个城市的数据时,某一行的数据说的是哪个城市,就可以一目了然。
反之,如果只给你看城市代码,你很快就会眼花缭乱,不知所云了。
但是,只有上面这一个函数,还是不够高效。
我们再定义一个函数,来遍历cityId
,
def get_dfs(cityname_dict, appcode):
dfs=[]
for cityId in cityname_dict:
dfs_times=[]
temp_df=get_df(cityId, cityname_dict, appcode)
dfs_times.append(temp_df)
city_df=pd.concat(dfs_times,ignore_index=True)
dfs.append(city_df)
return dfs
输入要查询城市的ID和名称字典:
cityname_dict={"2884":"丽江","379":"郑州","394":"洛阳","285255":"大理"}
调用函数get_dfs
:
dfs = get_dfs(cityname_dict, appcode)
查看dfs信息:
dfs=get_dfs(cityname_dict, appcode)
print(dfs)
输出
D:applicationAnaconda3python.exe F:/test/venv/learning/test.py
[ conditionDay conditionIdDay ... windLevelNight cityname
0 晴 0 ... 2 丽江
1 多云 1 ... 2 丽江
2 晴 0 ... 2 丽江
[3 rows x 15 columns], conditionDay conditionIdDay ... windLevelNight cityname
0 晴 0 ... 3 郑州
1 多云 1 ... 4-5 郑州
2 多云 1 ... 3-4 郑州
[3 rows x 15 columns], conditionDay conditionIdDay ... windLevelNight cityname
0 多云 1 ... 3 洛阳
1 多云 1 ... 3-4 洛阳
2 多云 1 ... 3 洛阳
[3 rows x 15 columns], conditionDay conditionIdDay ... windLevelNight cityname
0 晴 0 ... 2 大理
1 晴 0 ... 2 大理
2 晴 0 ... 2 大理
[3 rows x 15 columns]]
Process finished with exit code 0
我们发现其是一个列表,为了整合数据显示并存储,我们通过pd.concat
来整合数据:
df=pd.concat(dfs,ignore_index=True)
print(df)
输出
df=pd.concat(dfs,ignore_index=True)
print(df)
输出
D:applicationAnaconda3python.exe F:/test/venv/learning/test.py
conditionDay conditionIdDay ... windLevelNight cityname
0 晴 0 ... 2 丽江
1 多云 1 ... 2 丽江
2 晴 0 ... 2 丽江
3 晴 0 ... 3 郑州
4 多云 1 ... 4-5 郑州
5 多云 1 ... 3-4 郑州
6 多云 1 ... 3 洛阳
7 多云 1 ... 3-4 洛阳
8 多云 1 ... 3 洛阳
9 晴 0 ... 2 大理
10 晴 0 ... 2 大理
11 晴 0 ... 2 大理
[12 rows x 15 columns]
Process finished with exit code 0
这样我们提取的四个城市的最近三天的天气信息就获取到手了,如果想获取更多有价值的参数信息,就花几分到几角钱,购买能够获取更多信息的API接口,比如这个国控空气质量-城市级别批量接口,其中包含的参数如下:
![0b9a007047e0411d98122626afd18520.png](https://i-blog.csdnimg.cn/blog_migrate/20a61a999cbcd3aa0a7561f741d3e2df.jpeg)
点开接口查看详细信息:
![78c7c6a5bb633dc15166737d3b101693.png](https://i-blog.csdnimg.cn/blog_migrate/c9ccc304fa34d0b9ee4d0c7a0afe0417.jpeg)
import requests
#url='https://nairc.market.alicloudapi.com/api/v1/nation_air_by_city/city_day_list'
host = 'https://nairc.market.alicloudapi.com'
path = '/api/v1/nation_air_by_city/station_day_list'
method = 'GET'
appcode = '1e54cd988a7b471db608da14caae3263'
querys = 'city=%E6%AD%A6%E6%B1%89%E5%B8%82&pubtime=2019-01-07+00%3A00%3A00'
url = host + path + '?' + querys
city = '武汉市'
pubtime = '2019-01-07 00:00:00'
payload={'city':city,'pubtime':pubtime}
headers={'Authorization':'APPCODE {}'.format(appcode)}
r = requests.get(url,params=payload,headers=headers)
print(r.content)
输出:
D:applicationAnaconda3python.exe F:/test/venv/learning/test.py
b'{"success":false,"error_code":442,"error_info":"xe8xb6x85xe5x87xbaxe6x97xb6xe9x97xb4xe8x8cx83xe5x9bxb4"}'
Process finished with exit code 0
目前不清楚为啥返回错误信息。