2017-02-20 1 views
0

계정 목록에서 트위터 팔로어를 다운로드하려고합니다. 내 함수 (twython 사용)는 짧은 계정 목록에서는 꽤 잘 작동하지만 긴 목록에서는 오류가 발생합니다. 속도 제한값에 도달하면 내 함수가 다음 시간까지 잠자기 상태가되기 때문에 RateLimit 문제가 아닙니다. 오류가이Twitter API 연결이 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

'낮잠'의 값은 무엇입니까? 오후의 초기 값은 얼마입니까? 이해하기 위해서는 더 많은 컨텍스트를 제공해야합니다. – 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 예외를 추가로 발견했습니다. 제공된 사용자 이름이 인증 된 사용자가 볼 수있는 권한이없는 보호 된 계정과 관련된 경우 발생할 수 있습니다. 이 경우 다른 정보를 다운로드 할 수 있도록 사용자를 건너 뛰고 사용자가 액세스 할 수 없다는 경고를 인쇄합니다.

실행하면 액세스 할 수있는 모든 사용자에 대해 followerid의 텍스트 파일을 저장합니다. asongtoruin.txt

로 저장 (나 일명) asongtoruin의 추종자 ID로

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

하나의 가능한 문제가 따르는 우리의 페이지를 먼저 최신에서 시작 점에서,있다 : 나를 위해이 다음 인쇄합니다. 이 일 수 있습니다 (API를 충분히 이해할 수는 없지만 출력 데이터 세트에 문제가 있음). 새 사용자가 Google 호출간에 추가되면이 사용자가 없어져서 데이터 세트. 중복이 문제가 될 경우 return all_followersreturn set(all_followers)

+0

아 - 예상대로 예상대로'pip install tweepy'로'tweepy'를 설치할 수 있습니다. – asongtoruin

+0

그게 좋습니다! 나는 당신의 대답 (그리고 설명)에서 많은 것을 배웠다! 너무 애석 해 주셔서 고맙습니다! – mbiella

+0

@mbiella 걱정하지 마라! 나는 이것에 대해서도 많은 것을 골랐다. 그래서 그것은 우리 모두를 도왔다. :) – asongtoruin

관련 문제