Python调用微博API

    上头叫通过微博ID获取用户公布过的历史微博内容,于是研究了下新浪微博提供的API


    1 首先在微博开放中心下“创建应用”创建一个应用,应用信息那些随便填,填写完成后,不须要提交审核,须要的仅仅是那个app-key和app-secret


    2 在“微博开放平台”的“管理中心”找到刚才创建的应用,点开这个应用,点开左边“应用信息”栏,会看见“App key”和“App Secret”的字样,这两个东西是要在后面程序中使用的。然后在“应用信息”下的“高级信息”点击“编辑”button,将“授权回调页面”设置为:https://api.weibo.com/oauth2/default.html,将“取消授权回调页”也设置为:https://api.weibo.com/oauth2/default.html。


    3 再去http://github.liaoxuefeng.com/sinaweibopy/下载新浪微博SDK,python有个简单的安装方式:直接在命令行下键入:

sudo pip install sinaweibopy


    4 实例验证代码,通过微博提供的API抓取授权用户及其关注好友的微博:这里须要注意的是在浏览器弹出一个页面,要先点击“授权”(这里进行的OAuth 2认证,我理解为就是用户訪问我的应用后将页面导向新浪server然后用户输入信息到新浪server后授权给我的应用訪问用户数据,这里我将的微博授权给以下的程序了),授权后浏览器中的URL类似:https://api.weibo.com/oauth2/default.html?code=2024222384d5dc88316d21675259d73a将code后面那个拷贝到控制端,程序须要读入2024222384d5dc88316d21675259d73a这个数据

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from weibo import APIClient
import webbrowser#python内置的包
import pymongo
from pymongo import MongoClient
APP_KEY = '刚才那个App Key'#注意替换这里为自己申请的App信息
APP_SECRET = '刚才那个App Secret'
CALLBACK_URL = 'https://api.weibo.com/oauth2/default.html'#回调授权页面
#利用官方微博SDK
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
#得到授权页面的url,利用webbrowser打开这个url
url = client.get_authorize_url()
print url
webbrowser.open_new(url)
#获取code=后面的内容
print '输入url中code后面的内容后按回车键:'
code = raw_input()
#code = your.web.framework.request.get('code')
#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
# 设置得到的access_token
client.set_access_token(access_token, expires_in)
'''
#能够打印下看看里面都有什么东西
#print client.statuses__public_timeline()
statuses = client.statuses__public_timeline()['statuses']
length = len(statuses)
#输出了部分信息
for i in range(0,length):
print u'昵称:'+statuses[i]['user']['screen_name']
print u'简单介绍:'+statuses[i]['user']['description']
print u'位置:'+statuses[i]['user']['location']
print u'微博:'+statuses[i]['text']
'''
#获取授权用户及其关注好友的微博信息并写入mongo数据库
pagenum=1#微博API返回的微博数据是分页形式的,在API中通过设置页码来读取数据
write_location=MongoClient('localhost',27017)['data']['weiboapi_test']#这里是我自己的mongo数据库,不用mongo存储能够凝视掉
while(True):
	data=client.statuses.friends_timeline.get(page=pagenum)['statuses']
	if data:
		pagenum+=1#不断获取新的页面
		for i in range(len(data)):
			write_location.insert(data[i])#不用mongo存储能够凝视掉,直接改为print data[i]打印微博数据
	else:#假设读取完数据则结束
		break


在命令行运行:

python weibo_api.py #如果上面程序文件命名为weibo_api.py


会出现以下的字样:


输入url中code后面的内容后按回车键:

已在现有的浏览器会话中创建新的窗体。

2024222384d5dc88316d21675259d73a                   #注意这里输入上面那个授权后的浏览器中URL中code后面的东东

最后mongo中的数据类似于这样:


{ "_id" : ObjectId("5397d1709b6827148d2048bb"), "reposts_count" : 1, "favorited" : false, "in_reply_to_user_id" : "", "truncated" : false, "text" : "我不是漫画大师,也没主持康熙来了 [衰] 我们仨人,名字差非常多耶!... 怎么不说非常喜欢我办的北大 [偷笑] ... 这样迷糊曾经是怎么通过历史考试的呀!历史上这么多人名要记。", "created_at" : "Wed Jun 11 08:57:29 +0800 2014", "mlevel" : 0, "idstr" : "3720199951556592", "mid" : "3720199951556592", "visible" : { "type" : 0, "list_id" : 0 }, "attitudes_count" : 2, "pic_urls" : [ ], "in_reply_to_screen_name" : "", "user" : { "bi_followers_count" : 99, "domain" : "rebol", "avatar_large" : "http://tp1.sinaimg.cn/1614282004/180/40042297177/1", "verified_source" : "", "ptype" : 3, "statuses_count" : 5902, "allow_all_comment" : true, "id" : 1614282004, "verified_reason_url" : "", "city" : "1", "province" : "71", "block_app" : 0, "follow_me" : false, "verified_reason" : "银联移动支付首席产品架构师;《编程ING》《Java夜未眠》作者", "followers_count" : 100833, "location" : "台湾 台北市", "verified_trade" : "", "mbtype" : 2, "verified_source_url" : "", "profile_url" : "rebol", "block_word" : 0, "avatar_hd" : "http://ww4.sinaimg.cn/crop.0.0.179.179.1024/6037fd14gw1ebr3jqum0wj2050050jrl.jpg", "star" : 0, "description" : "", "friends_count" : 106, "online_status" : 0, "mbrank" : 1, "allow_all_act_msg" : true, "profile_image_url" : "http://tp1.sinaimg.cn/1614282004/50/40042297177/1", "idstr" : "1614282004", "verified" : true, "geo_enabled" : false, "class" : 1, "screen_name" : "蔡学镛", "lang" : "zh-cn", "weihao" : "", "remark" : "", "favourites_count" : 6, "name" : "蔡学镛", "ability_tags" : "开发人员", "url" : "", "gender" : "m", "created_at" : "Mon Aug 09 12:56:16 +0800 2010", "worldcup_guess" : 0, "verified_type" : 0, "following" : true }, "in_reply_to_status_id" : "", "comments_count" : 15, "geo" : null, "id" : NumberLong("3720199951556592"), "source" : "<a href=\"http://weibo.com/\" rel=\"nofollow\">微博 weibo.com</a>" }



新浪微博API不能通过指定ID提取用户的微博内容,除非是高级授权用户,我这种屌丝没有这种福啊。抓取少量用户能够将抓取的用户所有关注后然后通过授权用户抓取其本身和关注好友的微博。可行性不大。大量用户的微博数据获取似乎仅仅有写爬虫解析页面了。

posted @ 2015-05-11 17:12  hrhguanli  阅读(2316)  评论(0编辑  收藏  举报