2017-02-20 22 views
0

Я пытаюсь загрузить Twitter-подписчиков из списка учетных записей. моя функция (которая использует twython) работает очень хорошо для коротких списков учетных записей, но вызывает ошибку для более длинных списков. это не проблема с RateLimit, так как моя функция спит до следующего буфера, если предел скорости достигнут. ошибка этоСоединение с API-интерфейсом Twitter прервано с помощью Twython

twythonerror: («прервано подключение» ошибка (10054, «»))

других, кажется, имеют те же проблемы и предлагаемое решение, чтобы сделать функцию сна между различными ОСТАЛЬНЫМИ API, поэтому я выполнил следующий код:

del twapi 
    sleep(nap[afternoon]) 
    afternoon = afternoon + 1 
    twapi = Twython(app_key=app_key, app_secret=app_secret, 
       oauth_token=oauth_token, oauth_token_secret=oauth_token_secret) 

nap - это список интервалов в секундах, а днем ​​- индекс. , несмотря на это предложение, у меня все еще есть одна и та же проблема. кажется, что сон не разрешает проблему. Может ли кто-нибудь мне помочь?

здесь вся finction

def download_follower(serie_lst): 
    """Creates account named txt files containing followers ids. Uses for loop on accounts names list.""" 
    nap = [1, 2, 4, 8, 16, 32, 64, 128]  
    afternoon = 0 

    for exemplar in serie_lst: 

     #username from serie_lst entries 
     account_name = exemplar 

     twapi = Twython(app_key=app_key, app_secret=app_secret, 
         oauth_token=oauth_token, oauth_token_secret=oauth_token_secret) 

     try: 
      #initializations 
      del twapi 
      if afternoon >= 7: 
       afternoon =0 

      sleep(nap[afternoon]) 
      afternoon = afternoon + 1 
      twapi = Twython(app_key=app_key, app_secret=app_secret, 
         oauth_token=oauth_token, oauth_token_secret=oauth_token_secret) 
      next_cursor = -1 
      result = {} 
      result["screen_name"] = "" 
      result["followers"] = [] 
      iteration = 0 
      file_name = "" 

      #user info 
      user = twapi.lookup_user(screen_name = account_name) 

      #store user name 
      result['screen_name'] = account_name 

      #loop until all cursored results are stored 
      while (next_cursor != 0): 
       sleep(random.randrange(start = 1, stop = 15, step = 1)) 
       call_result = twapi.get_followers_ids(screen_name = account_name, cursor = next_cursor) 
       #loop over each entry of followers id and append each  entry to results_follower  
       for i in call_result["ids"]: 
        result["followers"].append(i) 
       next_cursor = call_result["next_cursor"] #new next_cursor 
       iteration = iteration + 1 
       if (iteration > 13): #skip sleep if all cursored pages are processed 
        error_msg = localtime() 
        error_msg = "".join([str(error_msg.tm_mon), "/", str(error_msg.tm_mday), "/", str(error_msg.tm_year), " at ", str(error_msg.tm_hour), ":", str(error_msg.tm_min)]) 
        error_msg ="".join(["Twitter API Request Rate Limit hit on ", error_msg, ", wait..."]) 
        print(error_msg) 
        del error_msg 
        sleep(901) #15min + 1sec 
        iteration = 0 

      #output file 
      file_name = "".join([account_name, ".txt"]) 

      #print output 
      out_file = open(file_name, "w") #open file "account_name.txt" 
      #out_file.write(str(result["followers"])) #standard format 
      for i in result["followers"]: #R friendly table format 
       out_file.write(str(i)) 
       out_file.write("\n") 
      out_file.close() 

     except twython.TwythonRateLimitError: 
      #wait 
      error_msg = localtime() 
      error_msg = "".join([str(error_msg.tm_mon), "/", str(error_msg.tm_mday), "/", str(error_msg.tm_year), " at ", str(error_msg.tm_hour), ":", str(error_msg.tm_min)]) 
      error_msg ="".join(["Twitter API Request Rate Limit hit on ", error_msg, ", wait..."]) 
      print(error_msg) 
      del error_msg 
      del twapi 
      sleep(901) #15min + 1sec 

      #initializations 
      if afternoon >= 7: 
       afternoon =0 

      sleep(nap[afternoon]) 
      afternoon = afternoon + 1 
      twapi = Twython(app_key=app_key, app_secret=app_secret, 
         oauth_token=oauth_token, oauth_token_secret=oauth_token_secret) 
      next_cursor = -1 
      result = {} 
      result["screen_name"] = "" 
      result["followers"] = [] 
      iteration = 0 
      file_name = "" 

      #user info 
      user = twapi.lookup_user(screen_name = account_name) 

      #store user name 
      result['screen_name'] = account_name 

      #loop until all cursored results are stored 
      while (next_cursor != 0): 
       sleep(random.randrange(start = 1, stop = 15, step = 1)) 
       call_result = twapi.get_followers_ids(screen_name = account_name, cursor = next_cursor) 
       #loop over each entry of followers id and append each entry to results_follower  
       for i in call_result["ids"]: 
        result["followers"].append(i) 
       next_cursor = call_result["next_cursor"] #new next_cursor 
       iteration = iteration + 1 
       if (iteration > 13): #skip sleep if all cursored pages are processed 
        error_msg = localtime() 
        error_msg = "".join([str(error_msg.tm_mon), "/", str(error_msg.tm_mday), "/", str(error_msg.tm_year), " at ", str(error_msg.tm_hour), ":", str(error_msg.tm_min)]) 
        error_msg = "".join(["Twitter API Request Rate Limit hit on ", error_msg, ", wait..."]) 
        print(error_msg) 
        del error_msg 
        sleep(901) #15min + 1sec 
        iteration = 0 

      #output file 
      file_name = "".join([account_name, ".txt"]) 

      #print output 
      out_file = open(file_name, "w") #open file "account_name.txt" 
      #out_file.write(str(result["followers"])) #standard format 
      for i in result["followers"]: #R friendly table format 
       out_file.write(str(i)) 
       out_file.write("\n") 
      out_file.close() 
+0

Каковы значения в 'nap'? Какова начальная стоимость «дня»? Для этого вам нужно предоставить еще один контекст, чтобы это было понятно. – asongtoruin

+0

nap = [1,2,4,8,16,32,64,128], а днем ​​инициализируется в 0 и при необходимости возвращается в 0. эта часть проверена, проблема в том, что, несмотря на то, что программа спит между каждым вызовом, сервер продолжает закрывать соединение. – mbiella

+0

Почему вы используете такие короткие остатки?Если это проблема ограничения скорости, то эти значения, вероятно, не будут достаточно длинными, чтобы попасть в следующее окно, если [как кажется] (https://dev.twitter.com/rest/public/rate-limits), лимит составляет 15 минут. – asongtoruin

ответ

0

Как обсуждалось в комментариях, есть несколько проблем с вашим кодом в настоящее время. Вам не нужно будет удалять ваше соединение, чтобы оно функционировало должным образом, и я думаю, что проблема возникает из-за того, что вы инициализируетесь во второй раз, не имея никаких уловов для достижения вашего лимита ставок. Ниже приведен пример использования Tweepy того, как вы можете получить информацию, которую требуется:

import tweepy 
from datetime import datetime 


def download_followers(user, api): 
    all_followers = [] 
    try: 
     for page in tweepy.Cursor(api.followers_ids, screen_name=user).pages(): 
      all_followers.extend(map(str, page)) 
     return all_followers 
    except tweepy.TweepError: 
     print('Could not access user {}. Skipping...'.format(user)) 

# Include your keys below: 
consumer_key = 'YOUR_KEY' 
consumer_secret = 'YOUR_KEY' 
access_token = 'YOUR_KEY' 
access_token_secret = 'YOUR_KEY' 

# Set up tweepy API, with handling of rate limits 
auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_token_secret) 
main_api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True) 

# List of usernames to get followers for 
lookup_users = ['asongtoruin', 'mbiella'] 

for username in lookup_users: 
    user_followers = download_followers(username, main_api) 
    if user_followers: 
     with open(username + '.txt', 'w') as outfile: 
      outfile.write('\n'.join(user_followers)) 
     print('Finished outputting: {} at {}'.format(username, datetime.now().strftime('%Y/%m/%d %H:%M:%S'))) 

Tweepy достаточно умен, чтобы знать, когда он достиг своего предела скорости, когда мы используем wait_on_rate_limit=True, и проверяет, как долго она должна спать прежде чем он сможет начать снова. Используя wait_on_rate_limit_notify=True, мы разрешаем ему вставлять, как долго он будет ждать, пока он не сможет получить страницу последователей (с помощью этого метода на основе ID кажется, что есть 5000 IDs per page).

Мы дополнительно поймаем исключение TweepError - это может произойти, если предоставленное имя пользователя относится к защищенной учетной записи, для которой у нашего аутентифицированного пользователя нет разрешения на просмотр. В этом случае мы просто пропустим пользователя, чтобы разрешить загрузку другой информации, но распечатайте предупреждение о невозможности доступа пользователя.

Запуск этого файла сохраняет текстовый файл идентификаторов следящих элементов для любого пользователя, к которому он может получить доступ. Для меня это выводит следующее:

Rate limit reached. Sleeping for: 593 
Finished outputting: asongtoruin at 2017/02/22 11:43:12 
Could not access user mbiella. Skipping... 

С ведомых идентификаторами asongtoruin (он же меня), сохраняемый в asongtoruin.txt

Существует одна возможная проблема в том, что наши страницы последователей начинать новейший первый. Это может (хотя я не понимаю API достаточно хорошо, чтобы сказать с уверенностью) приводят к проблемам с нашим выходным набором данных, если новые пользователи добавляются между нашими вызовами, так как мы можем пропустить этих пользователей и в итоге дублировать в наших набор данных. Если дубликаты станут проблемой, вы можете изменить return all_followers на return set(all_followers)

+0

О, и вы можете установить 'tweepy' с' pip install tweepy', как вы могли ожидать. – asongtoruin

+0

это замечательно !! Я многое узнал из вашего ответа (и объяснения)! большое спасибо @aongtoruin! – mbiella

+0

@mbiella не беспокойтесь! Я тоже много разбирался в этом, так что это помогло нам обоим :) – asongtoruin