腾讯微博关系链计算
博客专区 > 彼得 的博客 > 博客详情
腾讯微博关系链计算
彼得 发表于4年前
腾讯微博关系链计算
  • 发表于 4年前
  • 阅读 5858
  • 收藏 179
  • 点赞 31
  • 评论 16

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 数据分析涉及到各种节点和边关系,实际应用就是社交网络,选择了腾讯微博开放平台。微博开放API中笔者认为python是最方便易用的。本文简单介绍如何使用python关联并操作自己的微博。文中设计基本的方法,只做入门,复杂的调用未列出。制图计算参考:http://my.oschina.net/sanpeterguo/blog/195390

目标1:后台发微博,查看关系链等

第一步

成为开发者 http://dev.t.qq.com/ 需要填入一些基本的信息,如身份证号码等。

第二步:

创建应用,选择站内应用-非托管 ,主要是为了拿到appkey和app secret

第三步:

下载SDK http://wiki.open.t.qq.com/index.php/SDK%E4%B8%8B%E8%BD%BD

python SDK在这里 https://github.com/wbopenplatform/PY-SDK

第四步:

编写脚本,只运行 get_access_token()函数,获取到一个url,打开url,授权后获得新的url,获得ACCESS_TOKEN和OPENID的值。

第五步:

运行脚本的tweibo_test()函数,即可操作你的微博发消息或者查看你的粉丝,查看你关注的人。

# -*- coding:utf-8 -*- #
#! /usr/bin/env python

import time
import urllib  
import urllib2  
from tweibo import *

#首先要创建自己的应用,换成你的 APPKEY http://dev.t.qq.com/
APP_KEY = "801475XXX"  
APP_SECRET = "e52f7267447c3ccbcf7884809dbdXXXX"
CALLBACK_URL = "my.oschina.net/sanpeterguo"

#你的应用会去得到某个微博t.qq.com/peterguo的授权,获得方法即执行get_access_token即可获得一个url,这个url用浏览器打开,授权后连接地址中会增加ACESS_TOKEN参数,拿出来。

ACCESS_TOKEN = "06611ad81a58d8f517f614426f2XXXXX";
OPENID="30A1ACF2E94E5835A83D57CB80XXXXXX"

IMG_EXAMPLE = "example.png"

#调用API只需要上面的五个参数  APP_KEY APP_SECRET CALLBACK_URL  ACCESS_TOKEN OPENID

# 返回text是unicode,设置默认编码为utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

def get_access_token():
    oauth = OAuth2Handler()
    oauth.set_app_key_secret(APP_KEY, APP_SECRET, CALLBACK_URL)
    print oauth.get_access_token_url()
    
def tweibo_test():
    oauth = OAuth2Handler()
    oauth.set_app_key_secret(APP_KEY, APP_SECRET, CALLBACK_URL)
    oauth.set_access_token(ACCESS_TOKEN)
    oauth.set_openid(OPENID)
    
    api = API(oauth)    
    if False:
        #获取t.qq.com/qqfarm 的三条微博
        ret = api.get.statuses__user_timeline(format="json", name="qqfarm", reqnum=3, pageflag=0, lastid=0, pagetime=0, type=3, contenttype=0)
        print ret.data.info[0]['text']
    
    #获取自己的信息 http://test.open.t.qq.com/#friends/idollist

    if False:
        #知道微博id,获取自己的某条微博内容,查看该微博的id,打开源码找: <ul id="talkList" class="LC"><li  id="338597029252485" rel
        #view-source:http://t.qq.com/peterguo/mine
        api.get.t__show(format="json", id=338597029252485).data.text
        api.get.t__list(ids=[338597029252485, 338597029252485])
    
    if False:
        #获取peterguo的粉丝
        ret = api.get.friends__user_fanslist(name='peterguo')
        #print ret.data.info[0]['name']
        print "Peterguo s fans......"
        for dItem in ret.data.info:
            print dItem['name']    
 
    if False:
        #获取自己的偶像列表
        print "Peterguo s idols ......"
        ret = api.get.friends__idollist(name="peterguo", reqnum=20, pageflag=2)
        #print ret.data.info[5]['name']
        for dItem in ret.data.info:
            print dItem['name']
        
    if False:    
        #发微博 
        api.post.t__add(content='hi python')
        
        #发带图的微博,先上传图,获取到图片url,再发微博
        # UPLOAD /t/upload_pic
        pic1 = api.upload.t__upload_pic(format="json", pic_type=2, pic=open(IMG_EXAMPLE, "rb"))
        print ">> IMG: %s" % (pic1.data.imgurl)

        # POST /t/add_pic_url
        content_str2 = "哈哈哈 demo: %s, time %s" % (IMG_EXAMPLE, time.time())
        pic_urls = "%s" % (pic1.data.imgurl)
        tweet_pic1 = api.post.t__add_pic_url(format="json", content=content_str2, pic_url=pic_urls)
        print ">> time=%s, http://t.qq.com/p/t/%s" % (tweet_pic1.data.time, tweet_pic1.data.id)


    #双向收听的
    
    nCount = 0
    lCrawNames = ["waxjwaxj", "peterguo", "joliexu"]
    if len(sys.argv) != 1:
        lCrawNames = sys.argv[1:]
    for craw_name in lCrawNames:
        nIdx = 0
        while True:
            time.sleep(3)
            try:
                ret = api.get.friends__mutual_list(name=craw_name, reqnum=10, pageflag=1, startindex=nIdx)
            except tweibo.TWeiboError:
                break     
            for dItem in ret.data.info:
                nCount += 1
                try:
                    print nCount, dItem['name'], " -> ", dItem['nick']
                    fp = file("src.txt", "at")
                    fp.write("%s:%s:%s\n" %(craw_name, dItem['name'], dItem['nick']))
                    fp.close()
                except Exception,e:
                    print e

            nIdx += 10       
          

if __name__ == "__main__":    
    tweibo_test()


目标2:生成的数据如果配合networkx 进行计算绘图:

如下是计算笔者,笔者妻子和一个同事的微博互粉关系图:

  代码:

#-*- coding:utf8-*-

import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()


#G.add_nodes_from([3,4,5,6])
#G.add_edges_from([(3,5),(3,6),(6,7)])

def loadFile2List(strFilename):
    '''
    load a file and return content as list, every item is a line, except "#"
    '''
    retLst = []
    try:
        fp = file(strFilename, "rt")
    except IOError:
        assert(False)
        return retLst
    while True:
        line = fp.readline()
        if len(line) == 0:
            break;
        if line.startswith('#') or line == '\r\n' or line == '\n':
            continue
        line = line.strip()
        retLst.append(line)
    return retLst
    
srcLst = loadFile2List("src.txt")
dName2ListFriends = {}
for strLine in srcLst:
    lSptLine = strLine.split(":")
    if lSptLine == "":
        continue
    if not (lSptLine[0] in dName2ListFriends.keys()):
        dName2ListFriends[lSptLine[0]] = []
    dName2ListFriends[lSptLine[0]].append(lSptLine[1])

print dName2ListFriends     

lNodes = []
lEdges = []
for strKeyName in dName2ListFriends.keys():
    lNodes.append(strKeyName)
    for strName in dName2ListFriends[strKeyName]:
        lNodes.append(strName)
        lEdges.append((strKeyName, strName))

lNodes = list(set(lNodes))
lEdges = list(set(lEdges))
print lEdges
#raw_input("pause")
G.add_nodes_from(lNodes)
G.add_edges_from(lEdges)

nx.draw(G)
plt.savefig("wuxiangtu.png")
plt.show()


参考1:https://github.com/upbit/tweibo-pysdk/wiki/demo.py%E8%AF%A6%E8%A7%A3 

参考2:https://github.com/upbit/tweibo-pysdk/wiki/OAuth2Handler

共有 人打赏支持
彼得
粉丝 40
博文 121
码字总数 38726
评论 (16)
哪一天
博文很棒
你来人间一趟
我有密集恐惧症 看到你的图 一天都不舒服
konakona
不错的好文!
想问下楼主,腾讯微博有什么办法删除自己的微博内容吗?像新浪卧槽123那个APP那样! 2
言会咸
不明觉厉,呵呵13
Manhattan
看圖之後整個人都不舒服了。。
lazyphp
不错!这个貌似只是分析2 - 3层关系链。
itfanr
看圖之後整個人都不舒服了。。
中山野鬼

引用来自“lazyphp”的评论

不错!这个貌似只是分析2 - 3层关系链。

层数多了,量上去了哈。另外,不知道博主对环怎么处理的。
huangjacky
代码感觉看过的,而且有本书专门介绍这个,不过例子用的是twitter的。
彼得

引用来自“阳光灿烂的日子”的评论

我有密集恐惧症 看到你的图 一天都不舒服

这个只是举例入门而已,重点不在绘图,重点在计算。13
彼得

引用来自“konakona”的评论

不错的好文!
想问下楼主,腾讯微博有什么办法删除自己的微博内容吗?像新浪卧槽123那个APP那样! 2

http://test.open.t.qq.com/ 里面有删除微博的接口。
彼得

引用来自“Manhattan”的评论

看圖之後整個人都不舒服了。。

关系链计算,重点不在图。不过图形看起来更直观,这只是一个真是的小例子。
彼得

引用来自“huangjacky”的评论

代码感觉看过的,而且有本书专门介绍这个,不过例子用的是twitter的。

对,是有本书《社交网站的数据挖掘与分析》 http://book.douban.com/subject/10344930/ 看了一阵子,很多API都过时了,所以决定搞腾讯微博的。用自己的帐号做试验,比较有趣。
彼得

引用来自“中山野鬼”的评论

引用来自“lazyphp”的评论

不错!这个貌似只是分析2 - 3层关系链。

层数多了,量上去了哈。另外,不知道博主对环怎么处理的。

环的处理,networkx中都有现成的函数可以调用。
参考http://my.oschina.net/sanpeterguo/blog/195390
konakona

引用来自“彼得”的评论

引用来自“konakona”的评论

不错的好文!
想问下楼主,腾讯微博有什么办法删除自己的微博内容吗?像新浪卧槽123那个APP那样! 2

http://test.open.t.qq.com/ 里面有删除微博的接口。

好!看到了,我打算弄一个。
LastRitter
谢谢分享,我文章!!!!
×
彼得
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: