2015-04-24 4 views
2

Я пытаюсь получить число следящих за компаниями и отслеживать их с течением времени. У меня более 200 000 компаний, поэтому код, который у меня есть, буквально займет годы, чтобы работать с текущим лимитом api.Как получить счетчик подписчиков с помощью tweepy

c = tweepy.Cursor(api.followers_ids, id = a) 
ids = [] 
for id in c.items(): 
    time.sleep(0.01) 
    ids.append(id) ' 

В этом коде его один апи-хит для каждого последователя. Мне было интересно, есть ли функция, которая просто подсчитывает число последователей как число? И что такое предел twitter api?

+0

Если вам просто нужно количество следящих, а не идентификатор, вы можете получить эту информацию из метаданных каждого твита. Таким образом, при условии, что компании, которых вы хотите отслеживать, имеют достаточную активность, использование потокового api будет самым быстрым способом, кроме того, без ограничений по скорости. Тем не менее, 200 000 компаний слишком много, вы не можете отслеживать их с помощью терминов или имен screen_names ... максимум 5000 идентификаторов (см. [Здесь] (https://dev.twitter.com/streaming/reference/post/statuses/filter)). Даже с этим ограничением, это ваш лучший шанс ... 200.000 с лимитами API для REST потребуют от вас нескольких месяцев! Надеюсь, это поможет – lrnzcig

ответ

1

Каждого API запросы возвращают в большинстве 5000 идентификаторов последователей в то время, чтобы получить все последователь 200 000 компаний, здесь очень полезный скрипт из книги Mining социального веба- Мэтью А. Расселл решить предел твиттер апи

сделать запрос надежный щебет и получить доступ в Twitter API Matthew определены следующие методы:

import sys 
import time 
from urllib2 import URLError 
from httplib import BadStatusLine 
import json 
import twitter 

def oauth_login(): 
    CONSUMER_KEY = '' 
    CONSUMER_SECRET = '' 
    OAUTH_TOKEN = '' 
    OAUTH_TOKEN_SECRET = '' 
    auth = twitter.oauth.OAuth(OAUTH_TOKEN, OAUTH_TOKEN_SECRET, 
           CONSUMER_KEY, CONSUMER_SECRET) 
    twitter_api = twitter.Twitter(auth=auth) 
    return twitter_api 

def make_twitter_request(twitter_api_func, max_errors=10, *args, **kw): 
# A nested helper function that handles common HTTPErrors. Return an updated 
# value for wait_period if the problem is a 500 level error. Block until the 
# rate limit is reset if it's a rate limiting issue (429 error). Returns None 
# for 401 and 404 errors, which requires special handling by the caller. 
    def handle_twitter_http_error(e, wait_period=2, sleep_when_rate_limited=True): 
     if wait_period > 3600: # Seconds 
      print >> sys.stderr, 'Too many retries. Quitting.' 
      raise e 
# See https://dev.twitter.com/docs/error-codes-responses for common codes 
     if e.e.code == 401: 

      print >> sys.stderr, 'Encountered 401 Error (Not Authorized)' 
      return None 
     elif e.e.code == 404: 
      print >> sys.stderr, 'Encountered 404 Error (Not Found)' 
      return None 
     elif e.e.code == 429: 
      print >> sys.stderr, 'Encountered 429 Error (Rate Limit Exceeded)' 
      if sleep_when_rate_limited: 
       print >> sys.stderr, "Retrying in 15 minutes...ZzZ..." 
       sys.stderr.flush() 
       time.sleep(60*15 + 5) 
       print >> sys.stderr, '...ZzZ...Awake now and trying again.' 
       return 2 
      else: 
       raise e # Caller must handle the rate limiting issue 
     elif e.e.code in (500, 502, 503, 504): 
      print >> sys.stderr, 'Encountered %iError. Retrying in %iseconds' %\ 
      (e.e.code, wait_period) 
      time.sleep(wait_period) 
      wait_period *= 1.5 
      return wait_period 
     else: 
      raise e 
# End of nested helper function 
    wait_period = 2 
    error_count = 0 
    while True: 
     try: 
      return twitter_api_func(*args, **kw) 
     except twitter.api.TwitterHTTPError, e: 
      error_count = 0 
      wait_period = handle_twitter_http_error(e, wait_period) 
      if wait_period is None: 
       return 
     except URLError, e: 
      error_count += 1 
      print >> sys.stderr, "URLError encountered. Continuing." 
      if error_count > max_errors: 
       print >> sys.stderr, "Too many consecutive errors...bailing out." 
       raise 
     except BadStatusLine, e: 
      error_count += 1 
      print >> sys.stderr, "BadStatusLine encountered. Continuing." 
      if error_count > max_errors: 
       print >> sys.stderr, "Too many consecutive errors...bailing out." 
       raise 

вот методы, чтобы получить друзей и последователей:

from functools import partial 
from sys import maxint 

def get_friends_followers_ids(twitter_api, screen_name=None, user_id=None, 
friends_limit=maxint, followers_limit=maxint): 
    # Must have either screen_name or user_id (logical xor) 
    assert (screen_name != None) != (user_id != None),\ 
    "Must have screen_name or user_id, but not both" 
    # See https://dev.twitter.com/docs/api/1.1/get/friends/ids and 
    # https://dev.twitter.com/docs/api/1.1/get/followers/ids for details 
    # on API parameters 
    get_friends_ids = partial(make_twitter_request, twitter_api.friends.ids, 
          count=5000) 
    get_followers_ids = partial(make_twitter_request,twitter_api.followers.ids, 
           count=5000) 
    friends_ids, followers_ids = [], [] 
    for twitter_api_func, limit, ids, label in [ 
        [get_friends_ids, friends_limit, friends_ids, "friends"], 
        [get_followers_ids, followers_limit, followers_ids, "followers"] 
       ]: 
     if limit == 0: continue 
     cursor = -1 
     while cursor != 0: 

      # Use make_twitter_request via the partially bound callable... 
      if screen_name: 
       response = twitter_api_func(screen_name=screen_name, cursor=cursor) 
      else: # user_id 
       response = twitter_api_func(user_id=user_id, cursor=cursor) 
      if response is not None: 
       ids += response['ids'] 
       cursor = response['next_cursor'] 
      print >> sys.stderr, 'Fetched {0} total {1} ids for{2}'.format(len(ids), 
                label, (user_id or screen_name)) 
      # XXX: You may want to store data during each iteration to provide 
      # an additional layer of protection from exceptional circumstances 
      if len(ids) >= limit or response is None: 
       break 
    # Do something useful with the IDs, like store them to disk... 
    return friends_ids[:friends_limit], followers_ids[:followers_limit] 

# Sample usage 
twitter_api = oauth_login() 
friends_ids, followers_ids =get_friends_followers_ids(twitter_api, 
                 screen_name="SocialWebMining", 
                 friends_limit=10, 
                 followers_limit=10) 
print friends_ids 
print followers_ids 
+0

Не могли бы вы пропустить меня через то, что делает код, потому что он не работает для меня. –

+0

жаль, что я забыл определить две функции: ** make_twitter_request ** и ** oauth_login **, я отредактирую скрипт, он отлично работает для меня! –

+0

Вы должны отредактировать свой потребительский ключ и секрет. –

Смежные вопросы