1.4 来自API的数据
API(Application Programming Interface,应用程序接口)是软件程序或者网络服务与外界进行交互的接口,通过它可以得到程序或者网站所提供的一些数据。对API的更详细介绍,可以参阅:https://en.wikipedia.org/wiki/Application_programming_interface。
port可译为“端口”“接口”,通常用于硬件;interface可译为“界面”“接口”,一般指抽象化的中介物。
基础知识
网站提供API让开发者调用有关数据,已经是比较普遍的商业现象。此处列举简单的示例,让读者初步了解相关技能。
①所访问的是github.com网站提供的API,通过它获得用户名为qiwsir的用户在github.com上有关信息——qiwsir是本书作者在github.com网站的用户名。
从Out[1]的结果可知,①的访问请求成功了。
在1.3节演示爬虫技术的时候,曾经使用返回对象的text属性,得到了返回内容的字符串,即所得页面的源码。在In[2]中也可以通过text属性得到一个字符串,不过,对于API而言,一般得到的是JSON格式的数据,In[2]调用了返回对象的json方法,Out[2]显示的为其结果。
对于JSON格式的数据,可以认为是半格式化的数据,为了在数据分析和机器学习中使用,通常要从中选出所需要的部分,并保存为结构化数据,比如保存到CSV文件。
JSON(JavaScript Object Notation,JavaScript对象表示法)是轻量级的文本数据交换格式,独立于语言。JSON解析器和JSON库支持许多不同的编程语言。
②得到了JSON格式的数据,然后用③及其后面的语句从中抽取出所需要的部分,并将它们定义为DataFrame类型的数据(如④)——这是结构化的数据。
以上示例只是从通过API中得到了一个用户(qiwsir)的有关信息,如果有多个用户,则可以通过循环语句向github.com提交多次请求——修改In[1]的①中请求地址(https://api.github.com/users/{user}的{user}值为用户名)。
项目案例
1.项目描述
本地新闻API:https://news.baidu.com/widget?id=LocalNews&ajax=json。
利用此API,完成下述操作:
●得到本地新闻。
●将新闻标题、URL保存到CSV文档中。
URL包括以下各项。
1.协议:http:,代表网页使用的是HTTP协议。“https:”后面的“//”为分隔符。
2.域名:“news.baidu.com”。
3.端口:端口不是一个URL必需的部分,如果省略端口部分,则采用默认端口80。
4.虚拟目录:指域名后面的“/”,widget为目录名称。
5.参数:以“?”表示,id为参数,值为LocalNews。如果有多个参数,则用“&”作为分隔符。
2.实现过程
执行In[4]代码,得到了变量local_news所引用的JSON对象。建议读者执行此程序,并显示local_news的完整内容,通过分析其结构,以确定如何得到新闻标题和URL。
In[5]的⑤就是在对In[4]所得的JSON数据进行分析之后,得到所有的新闻列表,然后用循环语句取出每条新闻,并将其中的部分内容追加到一个空DataFrame中(如⑥所示)。
很多网站都向开发者提供了丰富的API,在网站之外的应用中调用本网站的有关数据。通常,网站都会提供比较完整的API相关文档,开发者应首先认真阅读文档,根据有关规定向网站提交请求后才能得到正确的回复信息。
动手练习
1.利用下面的API,查询任意指定日期对应的农历和相关其他信息。
使用requests的get请求此API,要增加headers参数。
API地址为https://www.sojson.com/open/api/lunar/json.shtml?date={data},data的格式为“年-月-日”,例如https://www.sojson.com/open/api/lunar/json.shtml?date=2019-07-28。
2.创建一个Python列表,其中的元素为国内部分城市名称(数量自定)。然后在网上找一个提供城市经纬度的API,获得每个城市的经纬度数值,并保存到CSV文档中。
扩展探究
大型网站一般都有“开放平台”,其中会包含多方面的API,以便开发者使用。请读者根据自己的兴趣,选择一个网站的“开放平台”,并深入研究其中的API使用方法,并获得某些有价值的数据。