网站调用新浪微博内容(新浪微博调用API的话,折腾一天终于小有收获,总结如下)
优采云 发布时间: 2022-02-26 12:06网站调用新浪微博内容(新浪微博调用API的话,折腾一天终于小有收获,总结如下)
这几天为了发论文,需要采集新浪微博的用户关系信息,形成一个复杂网络的*敏*感*词*。好在微博提供了一个API供我们调用。折腾了一天,终于有了小收获。总结如下:
1.下载SDK
如果使用python调用API,必须先到下一个Python SDK,sinweibopy
连接地址在这里:
可以使用pip快速导入,github连接中的wiki也有介绍使用方法,简单易懂。
2.了解新浪微博的授权机制
在调用API之前,首先要了解什么是OAuth 2,新浪微博的授权机制。
链接在这里:%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E
3.在新浪微博注册应用
大家可以通过新浪微博开发者平台注册自己的应用,我在网站上注册了应用。注册后,每个应用都会被分配一个唯一的app key和app secret,这是上面提到的授权机制中需要的,相当于每个应用的标识。
此时,我们可以尝试编写代码调用新浪微博的API。
4.简单的API调用示例
参考上面的很多资料和文档,写了一个简单的调用过程。
# _*_ coding: utf-8 _*_
from weibo import APIClient
import webbrowser
APP_KEY = ''
APP_SECRET = ''
CALLBACK_URL = ''
#这个是设置回调地址,必须与那个”高级信息“里的一致
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
url = client.get_authorize_url()
# TODO: redirect to url
#print url
webbrowser.open_new(url)
# 获取URL参数code:
code = '2fc0b2f5d2985db832fa01fee6bd9316'
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
r = client.request_access_token(code)
access_token = r.access_token # 新浪返回的token,类似abc123xyz456
expires_in = r.expires_in # token过期的UNIX时间:http://zh.wikipedia.org/wiki/UNIX%E6%97%B6%E9%97%B4
# TODO: 在此可保存access token
client.set_access_token(access_token, expires_in)
print client.friendships.friends.bilateral.ids.get(uid = 12345678)
通过上面的代码,我实现了调用相互关注API,即查找某个id的用户相互关注的人的列表。
其中APP_KEY和APP_SECRET是上一篇中分配给各个应用的信息。回调地址可以在各个应用的高级信息中看到。需要自己设置,但可以随便设置。
更恶心的是代码的获取。第一次看sinweibopy的文档的时候没明白什么意思。如上代码所示,获取到的url是一个授权的网站。
webbrowser.open_new(url)
这行代码打开浏览器跳转到授权的界面,然后观察其所在界面的URL,会显示大致相同的格式如下:
http://apps.weibo.com/sayarywei?code=505e3efcdad1f421d147db7276aabdbe
看见?问号后面有一个code=...,就是把等号后面的字符串复制过来赋值给代码,但是每次运行程序,代码都不是静态的,也就是说必须有每次都是这样的手册。收购过程对我来说很麻烦。以后自己研究,实现自动取码。谁能告诉我,不胜感激~
好了,拿到正确的代码后,就可以完成授权认证了,可以调用微博的API了。至于Python下怎么调用,我复制一下sinweibopy上的介绍:
首先查看新浪微博API文档,例如:
API:状态/用户时间线
请求格式:GET
请求参数:
source:字符串,OAuth授权方式不需要该参数,其他授权方式需要。值是 A*敏*感*词*ey?的应用程序。
access_token:字符串,OAuth授权的必填参数。其他授权方式不需要此参数。OAuth授权后获取。
uid:int64,要查询的用户ID。
screen_name:字符串,要查询的用户昵称。
(其他可选参数省略)
调用方法:将API的“/”改为“.”,根据请求格式为GET或POST调用get()或post(),传入关键字参数,但不收录source和access_token参数:
r = client.statuses.user_timeline.get(uid=123456)
for st in r.statuses:
print st.text
如果是POST调用,示例代码如下:
r = client.statuses.update.post(status=u'测试OAuth 2.0发微博')
如果需要上传文件,传入file-like object参数。示例代码如下:
f = open('/Users/michael/test.png', 'rb')
r = client.statuses.upload.post(status=u'测试OAuth 2.0带图片发微博', pic=f)
f.close() # APIClient不会自动关闭文件,需要手动关闭
请注意:上传的文件必须是类文件对象,不能是str,因为无法区分str是文件还是字段。您可以通过 StringIO 将 str 包装到类似文件的对象中