使用Python和阿里云API接口获取互联网数据

了解阿里云网站布局及API接口

首先,我们登录阿里云官网查看其布局,我们会爱上这个网站。其中很多前沿新知,我们也可以通过其提供的API接口来练手我们刚入门的python。可以直接通过自己的支付宝账号来登录阿里云。

这是阿里云的首页

我们登录它,来到云市场API服务。

API服务位置示意图

在这里我们会发现很多有趣的内容,比如说天气、物流查询、身份证识别、银行卡识别、表格识别等等。

阿里云列举的API接口

以天气为例,点击天气查询栏的进入选购,进入天气查询的API接口。

我们会发现阿里云平台为我们提供了丰富的获取数据的入口。

数据源

点击第一个来练手,毕竟一分钱也不用花,可以点击购买,购买后我们会获得一个AppCode,这个码比较重要,在我们调取API接口信息的时候需要用到,在买家中心的管理控制台页面可以查看到自己购买的商品信息。

购买后查看AppCode码

我们点击免费气象服务连接进入详情页。

在这里我们可以看到左边栏目给出了我们可以调用的信息,右边栏给出了我们调取的url地址,请求方式,返回类型。

信息详情页

不着急,我们继续看,后边我们看到其列出了请求参数,和代码示例。

这样我们是不是就可以照葫芦画瓢,不用心虚担心花了钱调取不到内容了吧。

这个简单的练手内容其实也不用一分钱。

后面熟练了可以花钱去调取其他更有意义的接口数据来做分析。

请求参数中cityid、token我们可以通过产品说明页的链接下载下来查看感兴趣的城市。

点击我获取cityid对照表点击我了解如何获取token

请求参数和代码示例
需要的参数链接

具体的参数,官方详情页都给出了详细的介绍,在这里不再赘述。

我们通过详情页的介绍可以了解各参数的意义以及调用方法。

现在我们有了API接口的AppCode码,token,cityid,调用示例也给了我们。

开始上手用python来获取数据。首先我们要具备python的环境,在这里不再具体写环境的搭建,我使用的是python3的环境Anaconda3。

我们在桌面建一个demo-api文件夹,打开Anaconda prompt,其实就是win下的cmd,prompt是Anaconda自带的命令行工具。我们进入到桌面自己新建的目录。

使用jupyter notebook命令进入我们的python环境,其会打开我们的默认浏览器作为我们的python环境。

进入python环境

我们看到已经进入刚才新建的demo-api文件夹下了,我们点击new新建一个python文件,我将它命名为moji_weather_api_data,现在就可以编辑我们的代码了。

新建文件

首先,要发送请求获取数据。因此我们要导入requests库。写入url地址,请求参数,发起请求。

cityId = '''394'''
token = '''your token number'''
import requests
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)

现在我们输入r,返回的是:

<Response [200]> 

别着急,200是个好数字,说明我们请求成功。
现在来查看r的信息:

r.content
b'{"code":0,"data":{"city":{"cityId":394,"counname":"\xe4\xb8\xad\xe5\x9b\xbd","name":"\xe6\xb4\x9b\xe9\x98\xb3\xe5\xb8\x82","pname":"\xe6\xb2\xb3\xe5\x8d\x97\xe7\x9c\x81","timezone":"8"},"forecast":[{"conditionDay":"\xe6\x99\xb4","conditionIdDay":"0","conditionIdNight":"30","conditionNight":"\xe6\x99\xb4","predictDate":"2018-09-21","tempDay":"28","tempNight":"15","updatetime":"2018-09-21 20:14:00","windDirDay":"\xe8\xa5\xbf\xe5\x8c\x97\xe9\xa3\x8e","windDirNight":"\xe8\xa5\xbf\xe9\xa3\x8e","windLevelDay":"4-5","windLevelNight":"3-4"},{"conditionDay":"\xe6\x99\xb4","conditionIdDay":"0","conditionIdNight":"30","conditionNight":"\xe6\x99\xb4","predictDate":"2018-09-22","tempDay":"29","tempNight":"14","updatetime":"2018-09-21 20:14:00","windDirDay":"\xe8\xa5\xbf\xe5\x8c\x97\xe9\xa3\x8e","windDirNight":"\xe8\xa5\xbf\xe9\xa3\x8e","windLevelDay":"3","windLevelNight":"3"},{"conditionDay":"\xe6\x99\xb4","conditionIdDay":"0","conditionIdNight":"31","conditionNight":"\xe5\xa4\x9a\xe4\xba\x91","predictDate":"2018-09-23","tempDay":"27","tempNight":"14","updatetime":"2018-09-21 20:14:00","windDirDay":"\xe4\xb8\x9c\xe5\x8c\x97\xe9\xa3\x8e","windDirNight":"\xe5\x8c\x97\xe9\xa3\x8e","windLevelDay":"3","windLevelNight":"3"}]},"msg":"success","rc":{"c":0,"p":"success"}}'

这都是什么呢 ,别着急 ,官方文档说返回的是json文件,因此我们导入json包,用 json 包的字符串处理功能(loads)解析返回内容,结果存入 content_json

import json
content_json=json.loads(r.content)

查看结果:

r.content返回结果

我们看到这是一个嵌套字典,提取data数据:content_json['data']

data数据

同样的,获取forecast数据:content_json['data']['forecast']

forecast数据

导入pandas,利用DataFrame将数据可视化输出:

将获取的数据转化为数据框

这样,我们第一步工作做完了。如果我们想获取更多的城市天气信息,采用一个个去输入城市id一个个运行显然是违背了利用计算机的强大来简化我们工作的初衷。

必须利用计算机来让我们可以偷个懒喝杯茶还能获取满意的结果才行,我们的前辈们告诉我们可以通过定义一个函数来循环运行我们的测试代码,从而实现一次获取多个城市的天气数据。

代码如下:

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信息:

运行结果

我们发现其是一个列表,为了整合数据显示并存储,我们通过pd.concat来整合数据:

df = pd.concat(dfs,ignore_index=True)

查看df信息:

df信息

这样我们提取的四个城市的最近三天的天气信息就获取到手了,如果想获取更多有价值的参数信息,就花几分到几角钱,购买能够获取更多信息的API接口,比如这个国控空气质量-城市级别批量接口,其中包含的参数如下:

详细参数列表

丰富吧,足够我们做一下数据分析和画漂亮的分析图了!

对了,我们生成的df对象,参数类型得了解一下吧,不然怎么分析处理数据。

df.dtypes
参数数据类型

我们发现我们的时间参数updatetime不是时间类型,需要转换成时间类型,温度不是数字类型,也需要我们处理:

df.updatetime = pd.to_datetime(df.updatetime)
df.tempDay = pd.to_numeric(df.tempDay)
df.tempNight = pd.to_numeric(df.tempNight )

再通过df.dtypes查看一下数据类型,我们发现就是正确的数据类型了,这些利用API获取的数据就可以通过python来做数据分析和处理啦。

python爱好者一个,刚起步,希望可以通过记笔记来提升自己,以及和各种爱好python的朋友一起探讨成长。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,916评论 2 89
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,917评论 25 707
  • 又被冤枉了,明明,我并没有用力去拽手机上的绳子,可,为什么就是不信呢。想想 ,我混的还真悲催,亲姐啊,就是不信,我...
    爱你就要追吗阅读 190评论 0 0
  • 小时候我们不懂 喜欢一个人是玩笑 最后, 看到她跟别人笑笑说说 才后悔!
    千秋莫阅读 119评论 0 0
  • 我的奶奶,长得特别可爱,矮矮的个子,圆圆的脸,带有两个小酒窝。前几年,她还赶时髦地烫了个洋气的卷发,看起来特别像个...
    真正的大丸子阅读 263评论 0 1