4-腾讯微博数据收集

为了练习python,于是写了个代码实现实时获取腾讯微博广播大厅的最新微博数据,每条查询结果以json的格式保存在文件当中

承接前一篇微博

http://loma1990.blog.51cto.com/6082839/1308205

主要在createApiCaller()函数里面添加appkey open_id access_token

已经实测 获取了280多万条微博数据

结果如下:

4-腾讯微博数据收集

代码如下:

#! /usr/bin/env python
#coding=utf-8
#Author:loma
#持续获取腾讯微博广播大厅的微博数据
'''
 * @author loma
 * qq:124172231 mail:[email protected]
 * Copyright (c) 2013, loma All Rights Reserved.
'''
import urllib2
import urllib
import webbrowser
import urlparse 
import os
import time
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')           
class ApiManager:
                                                                                                                 
    #获取使用api的公共参数
    def getPublicParams(self,appKey,access_token,open_id):
        params = {};
        params['oauth_consumer_key'] = appKey;
        params['access_token'] = access_token;
        params['openid'] = open_id;
        params['oauth_version'] = '2.a';
        params['scope'] = 'all';
        return params;
                                                                                                                 
    #通过Ie打开授权页面
    def OAuth2(self,appKey,redirect_url,response_type = 'token'):
        format = 'https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=%s&response_type=%s&redirect_uri=%s';
        url = format%(appKey,response_type,redirect_url);
        webbrowser.open_new_tab(url);
                                                                                                                 
    #从得到的URl解析出access_token和client_id到params字典中
    def decodeUrl(self,urlStr):
        urlStr = urlStr.replace('#','?');
        result=urlparse.urlparse(urlStr);
        params=urlparse.parse_qs(result.query,True);
        for a in params:
              print params[a]
                                                                                                                     
        return params;
                                                                                                                     
    #调用腾讯微博开放平台的api   
    def doRequest(self,appKey,open_id,access_token,apiStr,params):
        apiHead = 'http://open.t.qq.com/api/';
        requestParams = self.getPublicParams(appKey,access_token,open_id);
        requestParams.update(params);
        url = apiHead + apiStr + "?" + urllib.urlencode(requestParams);
        data = urllib2.urlopen(url);
        return data;
                                                                                                                 
#ApiCaller负责API的调用
class ApiCaller:
                                                                                                                 
    def __init__(self):
        self.count = 0
        self.apiManager = ApiManager()
        self.Callers = {}
                                                                                                                 
    #增加调用者
    def addCaller(self,appKey,open_id,access_token):
        self.Callers[len(self.Callers) + 1] = {"appKey":appKey,"open_id":open_id,"access_token":access_token}
        self.count = self.count + 1
                                                                                                                 
    #调用api
    def callAPI(self,apiStr,params):
        if self.count <= 0 or self.count > len(self.Callers):
            return False,None
                                                                                                                     
        caller = self.Callers[self.count]
        if self.count > 1:
            self.count = self.count % (len(self.Callers) -1) + 1
        while True:
            try:
                data = self.apiManager.doRequest(caller["appKey"],caller["open_id"],caller["access_token"],apiStr,params)
                break;
            except:
                print (u"10s后重试连接").encode('gbk')
                time.sleep(10);
                continue;
                                                                                                                         
        return True,data
                                                                                                                 
                                                                                                                 
class Spider:
    def __init__(self,callers):
        self.totalNum = 0 #用来保存微博数量
        self.caller = callers
        self.idSet = set()  #用来保存所有微博的id
        self.idList = [] #用来保存一次json里面的微博id
        self.isStop = False #用来结束spiding的循环的
        self.tag = 0
                                                                                                                     
        #不定时爬取微博数据
    def spiding(self,dataFile,sleepTime,apiStr,apiParams):
        self.initIdSet(dataFile)
        self.isStop = False
        weiboSum = 0
        while True:
            print (u"努力地爬取数据中....%d"%(self.tag)).encode('gbk')
            self.tag = self.tag + 1
            #调用API获取微博数据
            re,data = self.caller.callAPI(apiStr,apiParams)
            time.sleep(sleepTime)
            data = data.read()
            try:
                js = json.loads(data)
            except:
                print 'loads failed'
                continue
            if js['data'] == None:
                apiParams['pos'] = 0
                continue
            info = js['data']['info']
            pos = js['data']['pos']
            apiParams['pos'] = pos
                                                                                                                         
            #保存json里所有微博的id,用于判断是否有重复的微博
            self.idList = []
            for weibo in info:
                self.idList.insert(0,weibo['id'])
                                                                                                                         
            #过滤掉重复的微博
            js['data']['info'] = filter(lambda x:x['id'] not in self.idSet and self.idList.count(x['id']) == 1,info)
                                                                                                                         
            info = js['data']['info']
            print (u"此次获取的微博个数:%d"%(len(info))).encode('gbk')
            weiboSum = weiboSum + len(info)
            self.totalNum = self.totalNum + len(info)
            print (u"累计获取微博:%d 全部微博数量:%d"%(weiboSum,self.totalNum)).encode('gbk')
                                                                                                                         
            for weibo in info:
                    self.idSet.add(weibo['id'])   
                                                                                                                        
            if self.isStop == True:
                break
            jsStr = json.dumps(js,ensure_ascii=False,encoding='utf8')
           # print jsStr.decode('utf8').encode('gbk')
            file = open(dataFile,'a')
            file.write(jsStr + '\n')
            file.close()
                                                                                                                     
    def stopSpiding(self):
        self.isStop = True
                                                                                                                     
    def initIdSet(self,dataFile):
        try:
            file = open(dataFile,"r")
        except:
            return
        for line in file:
            js = json.loads(line)
            info = js['data']['info']
            for weibo in info:
                id = weibo['id']
                #print weibo['text'].decode('utf8').encode('gbk')
                self.idSet.add(id)
                self.totalNum = self.totalNum + 1
        file.close()
                                                                                                                     
                                                                                                                 
#授权调用
def doOAuth():
    #需要设置的地方
    appkey = '801348303';
    redirect_url = 'http://loma1990.blog.51cto.com';
                                                                                                                 
    #实例化
    manager = ApiManager();
                                                                                                                 
    #调用授权页面
    manager.OAuth2(appkey,redirect_url);
                                                                                                                 
    #等待用户输入授权后跳转到的页面里的url
    url = raw_input('Input the url');
                                                                                                                 
    #提取access_token和openid
    params = manager.decodeUrl(url);
    print params['openid']
    print "\"%s\",\"%s\",\"%s\""%(appkey,params['openid'],params['access_token'])
    #api参数设置
    apiParams = {'format':'json','pos':'0','reqnum':'100'};
                                                                                                                 
    #调用api获取数据
    data = manager.doRequest(appkey,params['openid'],params['access_token'],'statuses/public_timeline',apiParams);
                                                                                                                 
    #将获取的数据保存到指定文件中
    file = open("d:\\weibo.txt","wb");
    file.write(data.read());
    file.close();
                                                                                                                 
    #打印数据
    print data.read();
                                                                                                                 
#ApiCaller创建
def createApiCaller():
    callers = ApiCaller()
    #要在这边调用addCaller增加你的appKey,open_id,access_token 然后直接运行就可以了
    return callers
#doOAuth()
callers = createApiCaller()
#api参数设置
apiParams = {'format':'json','pos':0,'reqnum':100};
spider = Spider(callers)
spider.spiding('d:\\weiboBase.txt',5,'statuses/public_timeline',apiParams)
更多相关文章
  • 腾讯微博开放平台与AppCan开发平台达成战略合作,AppCan.cn专为腾讯微博定制的SDK,近日在腾讯微博开放平台正式上线,开发者可以登录腾讯微博开放平台官方网站下载(http://open.t.qq.com).腾讯微博AppCan-SDK支持HTML5跨平台开发,开发者只需一次编程,即可开发出 ...
  • 网站统计中的数据收集原理及实现share
    转载自:http://blog.codinglabs.org/articles/how-web-analytics-data-collection-system-work.html 网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析.百度统计和腾讯分析等等.所有这些统计 ...
  • http://blog.csdn.net/cleanfield/article/details/6339428 用户信息表(t_user_info) 字段名称 字节数 类型 描述 User_id 4 uint32 用户编号(主键) User_name 20 Char[20] 名称 Msg_count ...
  • Python 真的很方便啊,只要一个文本编辑器一个文件就能实现很多功能, 大爱哈,所以小写了下代码.#! /usr/bin/env python #coding=utf-8 #Author:loma #针对腾讯微博开放平台,获取用户的授权Token和Openid,以及利用API获取广播大厅的微博 i ...
  • 为改善网站的可用性, 一般采用可用性工程方法, 其核心是以用户为中心的设计方法论(UCD).综合介绍了目前国内外对于用户行为数据收集和分析方法所进行的研究, 各种方法的特点, 并介绍一些利用相应方法所开发出的工具实例, 使得建设的网站更加符合用户的需要, 以保障用户与网站之间沟通的顺畅. 随着In ...
  • ACT5.6动手实验手册如何在工作组模式下对客户端进行数据收集如何在AD域环境
    ACT5.6 动手实验手册实验的目标这个实验的目的是:· 了解如何部署ACT5.6· 了解如何在工作组模式下对客户端进行数据收集· 了解如何在AD域环境下对客户端进行数据收集本次试验大约60分钟完成安装环境 实验室中的计算机该实验室将使用三台计算机,如下面的表中描述.在开始之前的实验室中,您必须启动 ...
  • 数据收集类安全产品的模型
    从接触MVM开始,到大规模分布式部署,再到逐渐投入运维,终于对该产品有了一定的认识,在公司年会,也听到了其他相关安全产品的介绍,以下是对信息收集类安全产品的一点认识:首先是数据收集:不管是SOC,还是业务性能监控,不管是IPS还是漏洞扫描器(MVM).都有一个重要的环节---信息和数据的收集.没有数 ...
  •   对微博突然有了兴趣,想体验一把,因此准备开通腾讯微博.我在开通腾讯微博的时候,输入琢磨好的微博帐号“yzk”和姓名,点击[立即开通]按钮总是没有反应,重启了浏览器.重启了电脑都不行.后来以为是腾讯微博出现问题了,因此要下班了就没再弄它.   回到家里我又试了一把,还是不行,如果是腾讯出问题的话, ...
一周排行
  • 度量快速开发平台中网格部件中的单元格,在合并的时候触发,根据实现代码的内容来判断哪些单元格可以合并,哪些单元格不能合并.注意:要启用单元格合并事件,需要先设置网格部件的属性"允许单元格合并":勾上 ...
  • Gitlab客户端安装(for windows x64),下载附件
  • ORACLE中,约束分deferred 跟 immediate 2种:deferred:如果 Oracle 在事务提交(commit)时才对约束执行检查,则称此约束是延迟的(deferred).如果数据违反了延迟约束 ...
  •   据我了解中,给我映像最深的抄袭事件“百度输入法陷入抄袭事件遭搜狗索赔8千万”. 搜狗所提起的这一系列诉讼中,主张遭到侵权的专利不仅涉及诸如超级词库.智能组 词.云输入等核心输入功能,更涵盖了智能删除.候选展现等对 ...
  • 可编译不可运行如题,我写了一段名为a.java的程序如下: public   class   a { public   static   void   main(String[]   args){ System.ou ...
  • 从digg上看到的,不知道有没有人翻译,论坛的历史这么久了,一定有很多人总结了无数的发展社区的箴言.很多有志做社区的人都在不断选择和摸索中寻求发展,你必须首先舍得放弃那些跟自己的主流用户不相关的用户群,可能刚刚开始他 ...
  • 先后通过以上两个模拟器的学习,继续自己的交换路由之路!在网上了解到小凡模拟器实用性更好一些,今天下载此软件,学习学习!下载地址:点击这里(小凡模拟器安装软件)                     点击 http: ...
  • 1.rsyncrsync -avzP --delete SRC  DEST #同步,delete也同步 usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf  ...
  • 暴风转码1.2-简单易用的视频转换器
     五月购买了7寸屏的优派MP4,屏幕太大,所以播发从网上下载的MP4时都有黑边.搜索了很多 ...
  • 走到最后可能最后悔的5件事1.我希望当初我有勇气过自己真正想要的生活,而不是别人希望我过的生活. 2.我希望当初我没有花这么多精力在工作上. 3.我希望当初我能有勇气表达我的感受. 4.我希望当初我能和朋友保持联系. ...