python sdk 获取新浪微博签到信息

来源:互联网 发布:java程序设计教程 编辑:程序博客网 时间:2024/06/06 01:10

具体参考http://www.liaoxuefeng.com/article/00137389308005720bf24cb6cf14d9e897e7026dbc6a842000

不得不说廖大神这个sdk 在我这个新手看来写的真是太完美了,接口调用写成动态,封装授权,返回jsondict 

处理起来实在是方便

# -*- coding: utf-8 -*-'''Created on 2016年12月18日@author: bitwater基于python2.7写了一个类用来获取poiidlist,由于sina api的限制,也没必要多线程了,除非.....我创建了很多帐号,一旦有帐号被limit ,我就捕获这个异常并重新授权 ( while(1) ) api接口稳定行不是很好(可能是因为app_key为认证), 为了防止不可预料的错误,当数据量非常大的时候我尽量每次跑n条后 过几分钟再跑 ,参考下面的网站 ,官方说的很不明确限制到底是什么http://open.weibo.com/wiki/%E6%8E%A5%E5%8F%A3%E8%AE%BF%E9%97%AE%E9%A2%91%E6%AC%A1%E6%9D%83%E9%99%90经过反复测试,post或get可以达到连续万次请求(应该是极限了),不过这个不稳定我写了一个类用来获取所有的poiid然后又写了一个根据poiid list ,获取用户信息的类'''import weiboimport codecsfrom SinaSDK.PoiidList import PoiidListimport urllib2class Sina(object):            APP_KEY = [                               '4051276836',               '1859650768',               '1042452822',               '3221056763',               '367472040',               '2880955737',               '774292992',               '1611999631'               ]    APP_SECRET = [                                    '59f42a032177e22cfb738067fd481855',                  'ceb63e1afc177ad21d06e22317fa88c9',                  '4acf19662aff8a9dd1f5e2941d1975c1',                  '5a2d00b6face2762d92de04ee1e8d799',                  '0a7a707442089290b6fdaff9842f2786',                  '08811a2e2f6e0c2ae8ce8b63676b84a5',                  '01ecee0a13785b5e0b394b60c0acebc6',                  '72c202d5bc094ef57210909ecc290c66'                  ]    CALL_BACK = 'https://api.weibo.com/oauth2/default.html'        isUsed = 2        def __init__(self):                # app         self.app_key = Sina.APP_KEY[Sina.isUsed]        self.app_secert = Sina.APP_SECRET[Sina.isUsed]        self.call_back = Sina.CALL_BACK                Sina.isUsed = Sina.isUsed + 1        if Sina.isUsed >= len(Sina.APP_KEY):            Sina.isUsed = 0                    # client         self.client = ""                        self.weidu = ''        self.jingdu = ''                self.poiiddict = {}        self.poiidCnt = 0            def startAPIClient(self):        self.client = weibo.APIClient(self.app_key, self.app_secert, self.call_back)        # 获取该应用(APP_KEY是唯一的)提供给用户进行授权的url        auth_url = self.client.get_authorize_url()        # 打印出用户进行授权的url,将该url拷贝到浏览器中,服务器将会返回一个url,该url中包含一个code字段(如图1所示)        print auth_url        # 输入该code值(如图2所示)        code = raw_input("input the retured code : ")        # 通过该code获取access_token,r是返回的授权结果,具体参数参考官方文档:        # http://open.weibo.com/wiki/Oauth2/access_token        r = self.client.request_access_token(code)            # 将access_token和expire_in设置到client对象        self.client.set_access_token(r.access_token, r.expires_in)        return self.client                         def start(self, weidu , jingdu):        self.weidu = weidu        self.jingdu = jingdu                poilst = PoiidList(self.client , self.weidu , self.jingdu)                self.poiiddict , self.poiidCnt = poilst.getPoiid()                userinfo = UsersInfo(self.poiiddict , self.client)                   userinfo.getinfo()                      def printINFO (self):        print self.weidu        print self.jingdu        print self.poiidCnt                class UsersInfo(object):    '''    classdocs    '''    def __init__(self, poiiddict, Client):        '''        Constructor        '''        self.poiiddict = poiiddict        self.client = Client            def getinfo(self):                for Poiid in self.poiiddict.keys():                        while True :                 try :                    tmp = self.client.place.pois.users.get(poiid=Poiid, count=50, page=1)                    break                except weibo.APIError :                     sn = Sina()                    self.client = sn.startAPIClient()                except urllib2.HTTPError:                    pass                             # # 计算这个poiid 的总人数            try:                poiid_User_cnt = tmp['total_number']                        except TypeError:                continue                        filename = self.poiiddict[Poiid]            print u"一共有%d个人在%s签到" % (poiid_User_cnt, filename)                        # # 计算总页数            Cnt = poiid_User_cnt // 50                        if poiid_User_cnt % 50 != 0 :                Cnt = Cnt + 1            # # 创建文件并输出            fw = codecs.open("/home/bitwater/workSpace/eclipseSpace/sinaCraw/SinaSDK/sina/" + filename + ".csv", "w", "utf-8",)                        fw.write(u"有%d个" % (poiid_User_cnt))                        fw.write(u"用户名,用户id,出发地, 性别,签到时间\n")            # # 获取每一页            for i in range(1, Cnt + 1):                print "第%d页" % (i)                                while True :                                         try :                        everinfo = self.client.place.pois.users.get(poiid=Poiid, count=50, page=i)                        break                    except weibo.APIError :                         sn = Sina()                        self.client = sn.startAPIClient()                    except urllib2.HTTPError:                        pass #                         everinfo = self.client.place.pois.users.get(poiid=Poiid, count=50, page=i)                                    for user in everinfo['users']:                    fw.write(user['name'] + " ,")                    fw.write(str(user['id']))                    fw.write(" ,")                    fw.write(user['location'] + " ,")                    fw.write(user['gender'] + " ,")                    fw.write(user['checkin_at'] + '\n')            fw.close()        if __name__ == '__main__':        weidu = "+29.13"    jingdu = "+110.47"#     weidu = raw_input(u"输入维度")#     jingdu = raw_input(u"输入经度")        sina = Sina()    sina.startAPIClient()        sina.start(weidu, jingdu)            


# -*- coding: utf-8 -*-'''Created on 2016年12月19日@author: bitwater'''import weiboimport codecsfrom pyasn1.compat.octets import nullclass PoiidList(object):    '''    get poiid     '''    def __init__(self, Client, weidu, jingdu):        '''        Constructor        '''        self.client = Client        self.poiiddict = {}        self.weidu = weidu        self.jingdu = jingdu        self.poiid_cnt = 0                self.listlimit = 50    def getPoiid(self):        tmp = self.client.place.nearby.pois.get(lat=self.weidu , long=self.jingdu , count=50 , range=10000, sort=3)        self.poiid_cnt = tmp['total_number']         print "该位置一共有%d个Poiid" % (self.poiid_cnt)                 st = 1         cnt = self.poiid_cnt // self.listlimit         print "%d" % (cnt)                                        """        ceshi        """#         st = 5#         cnt = st + 4                         fw = codecs.open("/home/bitwater/workSpace/eclipseSpace/sinaCraw/SinaSDK/sina/PoiidList.txt", "w", "utf-8")        for i in range(st, cnt):            try:                print "%d" % (i)                tmp = self.client.place.nearby.pois.get(lat=self.weidu , long=self.jingdu , count=self.listlimit , range=10000, sort=3, page=i)                if tmp is null:                    break                 al = tmp['pois']                # 输出 Poiid 跟对应的 名称                 for one in al:                    print one['poiid'] , one['title']                    fw.write(one['poiid'])                    fw.write("  ")                    fw.write(one['title'])                    fw.write('\n')                    self.poiiddict[one['poiid']] = one['title']            except TypeError:                 continue                fw.close()               return self.poiiddict , self.poiid_cnt    



0 0
原创粉丝点击