API调用研究

Python下调用weiboAPI

Posted by 柠萌 on July 29, 2017

缘起

有一段时间想从微博中获取数据,于是就向试一下用API获取数据。基于这个出发点,我学会了使用微博API,虽然并没有通过weiboAPI获得什么实际用到的数据。


一、管中窥豹

在使用API之前,我们有必要了解一下到底什么是API。

API英文全称Application Programming Interface,即应用程序接口。接口(Interface)指两个独立部分用于传递信息的共同边界(a shared boundary across which two separate components of a computer system exchange information,from Wikipedia)。

所谓接口,就像USB插口一样,插上去就能传递信息。API就是提供给应用程序使用的接口,应用程序通过这个接口就可以简单地获取信息,而不需要知道底层代码或工作机制等细节,就像我们使用移动硬盘时只需要知道怎么将USB插口接到电脑上而不需要知道计算机是怎样实现从硬盘拷贝数据的。

这样的好处就是,我们获取数据时,早已有了预先定义好的通道,数据提供方已经将访问数据的方法打包好,我们直接用就可以了,不用担心到底是怎么访问数据的——这些琐事就交给新浪吧。当然,API也不只是用于获取数据,还能用于发送数据,即接口的传输可以是双向的。比如我们通过调用新浪微博的API不仅可以获取最新的微博消息,还能通过接口发布一则微博或评论。


二、牛刀小试

既然API是现成的数据获取渠道,那么调用方式也应该被精心设计,所以接口的调用应该是相对人性化的,也就是说对于要获取数据的一般用户,并不需要太深奥的知识都能使用,那么怎么调用API呢?

以下以新浪微博API为例初探如何调用API。

首先我们可以很容易找到新浪微博的API,里面有各种各样的接口(如图-1)。

图 - 1

我们先从“获取最新的公共微博”开始,点入左边的链接statuses/public_timeline,可以看到里面有许多项内容——URL、支持格式、请求方式、是否需要登录等等(如图-2)。

图 - 2

从这里我们可以知道这个接口调用要注意的东西,但现在我们似乎还看不懂,没关系我们,先把他放在一边,回到最初的问题上:如何调用API。

要知道如何调用,首先我们我知道在哪调用,这里采用一种简洁的语言——Python来调用我们API,如果不会Python也没关系,事实上你只要学会运行一个python程序就可以调用API了。

1. 调用环境的搭建

搭建调用环境听起来很高端,其实说白了就是装软件和设置的过程。

* Python的运行
* SDK的获取

SDK即软件开发工具包(Software Development Kit),为了方便调用API,sina提供了各种语言下调用API的SDK,具体参见网站Weibo SDK。其中python的SDK是由大神廖雪峰github写的,他的git上也有一些python教程。关于SDK,可以戳:

* 创建应用

我们要调用数据,数据提供者必然不能随便开放数据,在新浪微博API中,要获取数据,就需要app-key和app-secret。这两个东西就像是账号密码,用来证明你是开发者,通过你开发的这个应用来使用API。

要获得app-key和app-secret,我们首先要有一个app-,我们在新浪开发平台上创建一个应用,点击我的应用,然后认证信息后,点击微连接-其他,创建一个网页应用,不需要审核。

然后在【应用信息-基本信息】里面的app-key和app-secret(如图-3)。

图 - 3

在【应用信息-高级信息】里面【OAuth2.0授权设置】(如图-4)里输入回调地址,这个地址是授权后跳转的页面,你可以自己做一个网页作为回调页,也可以随便找一个网页作为回调页,图中我用的是我自己做的一个简易页面。

图 - 4

2. 尝试调用

在任意路径新建一个文件夹作为代码存储区,也作为我们的工作环境。

将SDK里的文件复制进该文件夹中。

新建一个文本文档,命名随意但后缀要为.py,我们将通过这个文件来调用API,注意创建的文档要是纯文本文档。

然后在文档中粘贴以下代码(demo1_pub_timeline.py),我们试着用下面这段代码来扒一些简单的数据吧。

# _*_ coding: utf-8 _*_

import sys
import weibo
import webbrowser
reload(sys)                                              # 使用UTF-8输出
sys.setdefaultencoding('utf-8')

APP_KEY = 'xxx'             # 将引号中的xxx替换为你的APP_KEY,保留引号
MY_APP_SECRET = 'yyy'       # 将引号中的yyy替换为你的APP_SECRET,保留引号
REDIRECT_URL = 'zzz'        # 将引号中的zzz替换为你的回调地址,保留引号

# 请求用户授权的过程
client = weibo.APIClient(APP_KEY, MY_APP_SECRET)            #
authorize_url = client.get_authorize_url(REDIRECT_URL)      #

# 自动打开浏览器,授权后复制地址栏中URL里的code字段
webbrowser.open(authorize_url)                              #

# 将code字段后的值复制输入
code = raw_input("input the code: ").strip()                #

# 获得用户授权
request = client.request_access_token(code, REDIRECT_URL)   #

# 保存返回的access_token,exires_in,uid
access_token = request.access_token                         #
expires_in = request.expires_in                             #
uid = request.uid                                           #

# 设置accsess_token
client.set_access_token(access_token, expires_in)           #

# 调用API
results = client.statuses__public_timeline()['statuses']    #

print "-----------the results is : "                        # 输出信息
length = len(results)                                       # 确定获取的信息条数
for i in range(0, length):
    print '昵称:' + results[i]['user']['screen_name'] + \
        ' 来自:' + results[i]['user']['location']
    print '时间:' + results[i]['created_at']
    print '来源:' + results[i]['source']
    print '微博:' + results[i]['text']
    print '转发:' + str(results[i]['reposts_count']) + \
        ' 评论:' + str(results[i]['comments_count']) + \
        ' 喜欢:'+str(results[i]['attitudes_count'])
    print
print "-----------all--------------"

在运行这段代码之前,我们要先将app-key和app-secret放进代码中,这样新浪微博才知道谁要调用这些数据。当然我们也要把回调地址写上,注意要和上面创建APP时你填的地址一样。

然后我们在终端中运行这段代码。如无意外,代码运行后,终端会提示输入code,同时浏览器会打开,然后会出现授权提示页面(如图-5)。

图 - 5

这是选择授权就会跳转到授权提示页面,我们需要将跳转后的URL地址中的“code=”后面的部分复制,输入到终端中(如图-6)。

图 - 6

然后我们就能看到终端上显示出了我们扒下来的数据(可以写文件保存:result.txt)啦(如图-7)!

图 - 7


三、更上层楼

API实质上是访问网站数据库的窗口,我们递交一个申请,网站返回数据,API和爬虫不同,爬虫是模拟人访问网页的行为获取网页,然后在获取的网页上提取数据,并通过网页的链接跳转继续获取数据,而API则是向服务器发送请求,服务器返回json格式的文件。所以API其实是官方提供的数据获取源。通常会对数据流量有一定的限制。

因此API调用的本质是:发送请求->返回数据->解析数据

1. HTTP请求

首先我们要发送的请求是通过HTTP进行请求的,HTTP的请求方式有几种:

  • HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
  • HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
方法 描述
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头。
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。

一般用到的就只有GET和POST,区别大概是GET用于获取数据,POST要在header中提交更多的参数用于提交数据。我们浏览网页,实际上是提交一个表单,向服务器请求数据。关于http协议的教程,具体可以看HTTP教程,具体请求方式python中一般是使用urllib和urllib2两个模块的urlopen()函数。

我们在微博API的使用手册中可以看到,每个API都有写明HTTP请求方式,使用SDK可以不需要深入了解HTTP请求方式即可调用API。

2. OAuth授权简介

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。

新浪微博API采用OAuth2.0授权,具体原理可以参考理解OAuth 2.0,这里我们只需要知道通过授权码认证后,我们的程序可以获得用户账号的某些权限,比如查看微博、发微博等。这个授权码,其实就是上文提到“code=”后面的那串字符。

3. 使用SDK

使用SDK很方便的一点就是可以不用管这些,直接就使用SDK(weiboAPI模块)里的函数。

上文demo.py中调用了几个函数:

其中client.get_authorize_url()函数可以返回授权页;

client.request_access_token()用于获得包括access_token的返回数据;

使用client.set_access_token()函数设置access_token后就可以调用API了。

API接口有很多,demo中调用的是公众时间流,可以获取公共微博数据。这些接口的调用方式在微博开放平台-微博API中可以找到。

比如当前用户关注的人的最新微博的APIstatuses/home_timeline其URL是”https://api.weibo.com/2/statuses/home_timeline.json”,调用就可以直接使用如下方法,其实就是把“/”换成“.”,然后后面加上请求方式(.get/.post)。

result = client.statuses.home_timeline.get()

如果要调用某些API需要提交请求参数的,那就在括号里面加上参数名=具体参数,如comments/create(这个API是POST请求方式,请求参数如图-8),那就应该写成如下形式。

图 - 8

    results = client.comments.create.post(comment="你好帅啊!",
                                          id=4129569084024445)

调用后结果如下:

图 - 9

用API发条评论也是很有趣的嘛~

4. 访问频次

API接口不是无限次数访问的,官方文档-接口访问频次权限这样写道:

微博开放接口限制每段时间只能请求一定的次数。限制的单位时间有每小时、每天;限制的维度有单授权用户和单IP;部分特殊接口有单独的请求次数限制。例如:

  • 一个应用内单授权用户每小时只能请求微博开放接口n次;
  • 一个应用内单授权用户每天累计只能请求微博开放接口m次;
  • 一个IP地址每小时只能请求微博开放接口x次;
  • 发微博接口单授权用户每小时只能请求y次; 其中n、m、x、y的具体数值,微博开放平台将采用应用质量评估系统,实现智能评估应用质量,质量高的应用相应的这些数值就高,也就是请求限制小。因此限制值不固定,不同的应用有不同的限制,取决于应用自身的质量。

使用API接口account/rate_limit_status,可以查看当前应用的频次限制。

5. 自动获取授权码

这部分由于各种原因没有去研究,以后不知道什么时候才有空去研究,这里先贴一个链接:python模拟登录新浪微博自动获得调用新浪api所需的code

大概看了一下好像就是直接用requests请求的。


四、返躬内省

一开始研究API是为了通过API获取微博的数据,但后来发现,API对频次的限制比较严格,而且获取的方法比较单一,后来就转向使用爬虫。但如果要获取用户间的关系的话,使用API似乎也是可行的。

API的用途更多是用在应用接入方面,比如用在我们用某些软件或网页中的“分享到新浪微博”的接口,还是有其作用的。

另外新浪微博的API和twitter的API是很像的,《社交网站的数据挖掘与分析》第一章讲的就是twitte的API使用方法,大家有空可以看看。

其实这篇文章大约半年前就开始写了,最近才将之前的东西整理了一下,接下来我会写几篇关于上学期学习简单爬虫的艰苦历程,可能还会研究一下百度地图的API,不过不知道什么时候才能写出来。

代码已发到Github - api

代码参考自:微博 获取指定用户发表的所有微博

2017.07.27 于广州