上头叫通过微博ID获取用户发布过的历史微博内容,于是研究了下新浪微博提供的API
1 首先在微博开放中心下“创建应用”创建一个应用,应用信息那些随便填,填写完毕后,不需要提交审核,需要的只是那个app-key和app-secret
2 在“微博开放平台”的“管理中心”找到刚才创建的应用,点开这个应用,点开左边“应用信息”栏,会看见“App key”和“App Secret”的字样,这两个东西是要在后面程序中使用的。然后在“应用信息”下的“高级信息”点击“编辑”按钮,将“授权回调页面”设置为: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认证,我理解为就是用户访问我的应用后将页面导向新浪服务器然后用户输入信息到新浪服务器后授权给我的应用访问用户数据,这里我将的微博授权给下面的程序了),授权后浏览器中的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提取用户的微博内容,除非是高级授权用户,我这样的屌丝没有这样的福啊。抓取少量用户可以将抓取的用户全部关注后然后通过授权用户抓取其本身和关注好友的微博。可行性不大。大量用户的微博数据获取似乎只有写爬虫解析页面了。
原文地址:http://blog.csdn.net/liuxuejiang158blog/article/details/30042493