研究生导师布置的作业!利用Python和API收集与分析网络数据!
猜猜看,下面这一组调查对象是什么?
为什么会这样呢?
因为我在布置作业的时候,很贴心地给了一个样例,是我之前写的一篇教程《 如何用R和API免费获取Web数据? 》。
于是,多组作业,都雷同。
讲到这里,他们一副不好意思的表情。
我却发觉,这里蕴藏着一个问题。
几乎所有国内云市场的 API 产品,都有丰富的文档。不少还干脆给出了各种编程语言对应调用代码。
这是一款收费 API ,100次调用的价格为1分钱。
作为作业练习,100次调用已经足够了。
这价格,他们表示可以接受。
我自己走了一遍流程。
点击“立即购买”按钮。
你会被引领到付费页面。如果你没有登录,可以根据提示用淘宝账号登录。
支付1分钱以后,你会看到如下的成功提示。
之后,系统会提示给你一些非常重要的信息。
如果你的操作系统里面已经安装了 curl (没有安装的话,可以点击这个链接,寻找对应的操作系统版本下载安装),尝试把上图中 curl 开头的那一行代码拷贝下来,复制到文本编辑器里面。
就像这样:
curl -i -k --get --include 'https://ali-weather.showapi.com/weatherhistory?area=%E4%B8%BD%E6%B1%9F&areaid=101291401&month=201601' -H 'Authorization:APPCODE 你自己的AppCode'
然后,一定要把其中的“你自己的AppCode”这个字符串,替换为你真实的 AppCode 。
把替换好的语句复制粘贴到终端窗口里面运行。
运行结果,如下图所示:
看见窗口下方包含中文的数据了吗?
利用 API 获取数据,就是这么简单。
上图中,除了刚才我们使用的 curl ,还包括以下语言访问 API 接口的样例说明:
-
Java
-
C#
-
PHP
-
Python
-
Object C
我们以 Python 作为例子,点开标签页看看。
你只需要把样例代码全部拷贝下来,用文本编辑器保存为“.py”为扩展名的 Python 脚本文件,例如 demo.py 。
为什么许多学生做不出来结果呢?
我让他们实际跑了一下,发现确实有的学生粗心大意,忘了替换自己的 AppCode 。
但是大部分同学,由于安装最新版本的 Anaconda (Python 3.6版),都遇到了下面的问题:
你可能会认为这是因为没有正确安装 urllib2 模块,于是执行
pip install urllib2
你可能会看到下面的报错提示:
在他们看来,官方网站提供的样例,就应该是可以运行的。报了错,又不能通过自己的软件包安装“三板斧”来解决,就会慌乱和焦虑。
更进一步,他们也不太了解 JSON 格式。
虽然,JSON已是一种非常清晰的、人机皆可通读的数据存储方式了。
他们想了解的,是怎么把问题迁移到自己能够解决的范围内。
环境
首先我们来看看代码运行环境。
前面提到过,如果样例代码的运行环境,和你本地的运行 环境不一 ,计时代码本身没问题,也无法正常执行 。
这个界面来自 Jupyter Lab。
图中左侧分栏,是工作目录下的全部文件。
右侧打开的,是咱们要使用的ipynb文件。
根据我的讲解,请你逐条执行,并仔细观察运行结果。
本例中,我们主要会用到以下两个新的软件包。
首先是号称“给人用”(for humans)的HTTP工具包requests。
代码
首先,读入HTTP工具包requests。
import requests
第二句里面,有“Your AppCode here”字样,请把它替换为你自己的AppCode,否则下面运行会报错。
appcode = 'Your AppCode here'
我们尝试获取丽江5月份的天气信息。
在API信息页面上,有城市和代码对应的表格。
位置比较隐蔽,在公司简介的上方。
看来我们需要在HTTP数据头(header)中,加入 AppCode。
我们依次把这些信息都写好。
url = 'https://ali-weather.showapi.com/weatherhistory'payload = {'areaid': areaid, 'month': month}headers = {'Authorization': 'APPCODE {}'.format(appcode)}
下面,我们就该用 requests 包来工作了。
requests 的语法非常简洁,只需要指定4样内容:
-
调用方法为“GET”
-
访问地址 url
既然调用成功,我们看看 API 接口返回的具体数据内容吧。
调用返回值的 content 属性:
r.content
这一屏幕,密密麻麻的。
其中许多字符,甚至都不能正常显示。这可怎么好?
没关系,从 API 信息页上,我们得知返回的数据,是 JSON 格式。
返回的是一个列表。
因为列表里面只有一个城市,所以我们只让它返回第一项即可。
dfs[0]
这次显示的,就是数据框了:
假设我们要综合分析几个城市的天气信息,那么就可以把这几个数据框整合在一起。
用到的方法,是 Pandas 内置的 concat
函数。
它接收一个数据框列表,把其中每一个个数据框沿着纵轴(默认)连接在一起。
df = pd.concat(dfs)
看看此时的总数据框效果:
df
这是开头部分:
这是结尾部分:
3个城市,4个多月的数据都正确读取和整合了。
下面我们尝试做分析。
这次就对了,日期和 AQI 都分别变成了我们需要的类型。其他数据,暂时保持原样。
有的是因为本来就该是字符串,例如城市名称。
另一些,是因为我们暂时不会用到。
下面我们绘制一个简单的时间序列对比图形。
读入绘图工具包 plotnine 。
注意我们同时读入了 date_breaks
,用来指定图形绘制时,时间标注的间隔。
我们指定横轴为时间序列,纵轴为 AQI,用不同颜色的线来区分城市。
绘制时间的时候,以“2周”作为间隔周期,标注时间上的数据统计量信息。
我们修改横轴的标记为中文的“日期”。
因为时间显示起来比较长,如果按照默认样式,会堆叠在一起,不好看,所以我们让它旋转45度角,这样避免重叠,一目了然。
为了让图中的中文正常显示,我们需要指定中文字体,这里我们选择的是开源的“文泉驿微米黑”。
数据可视化结果,如下图所示。
怎么样,这张对比图,绘制得还像模像样吧?
从图中,你可以分析出什么结果呢?
反正我看完这张图, 很想去丽江 。
当然,要是能给我的repo加一颗星,就更好了。
讨论
你之前尝试过用 Python 和 API 获取数据吗?你使用了哪些更好用的软件包进行数据获取、处理、分析与可视化呢?你还使用过哪些其他的数据产品市场?欢迎留言,把你的经验和思考分享给大家,我们一起交流讨论。
转载于:玉树芝兰”(nkwangshuyi) 。
欢迎关注我的博客:https://home.cnblogs.com/u/Python1234/
欢迎加入千人交流答疑群:125240963