研究生导师布置的作业!利用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

猜你喜欢

转载自www.cnblogs.com/Python1234/p/9069087.html
今日推荐