如何通过python调用新浪微博的API来爬取数据

如何通过python调用新浪微博的API来爬取数据,第1张

先上结论,通过公开的api如果想爬到某大v的所有数据,需要满足以下两个条件:

1、在你的爬虫开始运行时,该大v的所有微博发布量没有超过回溯查询的上限,新浪是2000,twitter是3200。

2、爬虫程序必须不间断运行。

新浪微博的api基本完全照搬twitter,其中接口的参数特性与底层的NoSQL密不可分,建议先看点Nosql数据库的设计理念有助于更好的理解api设计。

一般来说,如果决定爬某个大v,第一步先试获取该用户的基本信息,中间会包含一条最新的status,记下其中的id号作为基准,命名为baseId。

接口中最重要的两个参数:

since_id:返回ID比since_id大的微博(即比since_id时间晚的微博),默认为0。

max_id:返回ID小于或等于max_id的微博,默认为0。

出于各种原因,获取statuses的接口,固定为按id降序排列(scan_index_forward=false),即最新的statuses返回在前。假设该微博第一天上线,就一个用户,发了一百条,id是1到100。而你在该用户发了第50条的时候开始运行的爬虫,即baseId=50。

选择开始菜单中→程序→【Management SQL Server 2008】→【SQL Server Management Studio】命令,打开【SQL Server Management Studio】窗口,并使用Windows或 SQL Server身份验证建立连接。

在【对象资源管理器】窗口中展开服务器,然后选择【数据库】节点

右键单击【数据库】节点,从d出来的快捷菜单中选择【新建数据库】命令。

执行上述 *** 作后,会d出【新建数据库】对话框。在对话框、左侧有3个选项,分别是【常规】、【选项】和【文件组】。完成这三个选项中的设置会后,就完成了数据库的创建工作,

在【数据库名称】文本框中输入要新建数据库的名称。例如,这里以“新建的数据库”。

在【所有者】文本框中输入新建数据库的所有者,如sa。根据数据库的使用情况,选择启用或者禁用【使用全文索引】复选框。

在【数据库文件】列表中包括两行,一行是数据库文件,而另一行是日记文件。通过单击下面的【添加】、【删除】按钮添加或删除数据库文件。

切换到【选项页】、在这里可以设置数据库的排序规则、恢复模式、兼容级别和其他属性。

切换到【文件组】页,在这里可以添加或删除文件组。

完成以上 *** 作后,单击【确定】按钮关闭【新建数据库】对话框。至此“新建的数据”数据库创建成功。新建的数据库可以再【对象资源管理器】窗口看到。

1.下载SDK

使用python调用API的话,首先要去下一个Python的SDK,sinaweibopy

连接地址在此: http://michaelliao.github.com/sinaweibopy/

可以使用pip很快的导入,github连接里的wiki也有入门的使用方法,很容易看懂。

2.理解新浪微博的授权机制

在调用API之前,首先要搞懂什么叫OAuth 2,即新浪微博的授权机制,

连接在此: http://open.weibo.com/wiki/%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就是前文中分配给每个应用的信息,回调地址在每个应用的高级信息中可以看到,需要自己设置,不过随便设置一下就好

比较恶心的是code的获取,我一开始看sinaweibopy的文档的时候也没弄懂是什么意思,如上面的代码所示,url得到的是一个授权的网址,我们通过

webbrowser.open_new(url)

这行代码打开浏览器跳转到授权的界面,然后观察所在界面的网址,会显示大概如下一样的格式:

http://apps.weibo.com/sayarywei?code=505e3efcdad1f421d147db7276aabdbe

看到了吗? 问号后面有一个code=……的一个东西,把等号后面的字符串拷贝下来赋给code就可以了,但是每次运行程序是code不是一成不变的,也就是说每次都要有这么一个手动获取的过程,我觉得很麻烦,以后自己再研究一下,实现自动获取code就好了。如果能有哪位大神告诉我,感激不尽~

好了,得到正确的code之后就可以完成授权认证,也就可以调用微博的API啦,至于如何在Python下调用,我拷贝一下sinaweibopy上的介绍:

首先查看新浪微博API文档,例如:

API:statuses/user_timeline

请求格式:GET

请求参数:

source:string,采用OAuth授权方式不需要此参数,其他授权方式为必填参数,数值为应用的AppKey?。

access_token:string,采用OAuth授权方式为必填参数,其他授权方式不需要此参数,OAuth授权后获得。

uid:int64,需要查询的用户ID。

screen_name:string,需要查询的用户昵称。

(其它可选参数略)

调用方法:将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不会自动关闭文件,需要手动关闭

请注意:上传的文件必须是file-like object,不能是str,因为无法区分一个str是文件还是字段。可以通过StringIO把一个str包装成file-like object

希望我的回答对你有帮助,望采纳。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6788039.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-28
下一篇 2023-03-28

发表评论

登录后才能评论

评论列表(0条)

保存