2017-06-13 27 views
0

我寫了這個代碼來獲取Twitter帳戶的追隨者的完整列表使用Tweepy:如何獲得並保存到文件Twitter帳戶的追隨者的完整列表,與Tweepy

# ... twitter connection and streaming 

fulldf = pd.DataFrame() 
line = {} 
ids = [] 
try: 
    for page in tweepy.Cursor(api.followers_ids, screen_name="twittername").pages(): 
     df = pd.DataFrame() 
     ids.extend(page) 
     try: 
      for i in ids: 
       user = api.get_user(i) 

       line = [{'id': user.id, 
       'Name': user.name, 
       'Statuses Count':user.statuses_count, 
       'Friends Count': user.friends_count, 
       'Screen Name':user.screen_name, 
       'Followers Count':user.followers_count, 
       'Location':user.location, 
       'Language':user.lang, 
       'Created at':user.created_at, 
       'Time zone':user.time_zone, 
       'Geo enable':user.geo_enabled, 
       'Description':user.description.encode(sys.stdout.encoding, errors='replace')}] 
       df = pd.DataFrame(line) 
       fulldf = fulldf.append(df) 
       del df 
       fulldf.to_csv('out.csv', sep=',', index=False) 
       print i ,len(ids) 
     except tweepy.TweepError: 
      time.sleep(60 * 15) 
      continue 
except tweepy.TweepError as e2: 
    print "exception global block" 
    print e2.message[0]['code'] 
    print e2.args[0][0]['code'] 

最後我只有1000線在csv文件中,將所有內容保存在內存(dataframe)並將其保存到相同的循環中並不是最佳解決方案。但至少我有一些工作,但沒有得到15000名追隨者中的1000人。

任何幫助,這將不勝感激。

+0

有些機會是''例外全局塊''打印? – asongtoruin

+0

是的,我不是專家,所以我只想知道它在哪裏發生。但這不是問題,我認爲這是將數據保存到文件中的問題。 – lazurens

+0

我認爲這與你試圖捕捉錯誤的方式有關。如果你當時沒有答案,我今天晚上會看看它。 – asongtoruin

回答

2

考慮你的代碼的以下部分:

for page in tweepy.Cursor(api.followers_ids, screen_name="twittername").pages(): 
     df = pd.DataFrame() 
     ids.extend(page) 
     try: 
      for i in ids: 
       user = api.get_user(i) 

當您使用extend的每一頁,只需添加新集ID到您的ids列表的末尾。你嵌套你的for聲明的方式意味着你返回的每一個新頁面,你的所有前面的頁面,你get_user首先 - 因此,當你打到ids的最後一頁時,你仍然在看第一個1000左右當你達到費率限制並且沒有更多頁面瀏覽時。你也可能達到你的遊標速度限制,這就是你看到這個例外的原因。

讓我們從頭開始。

首先,當您使用wait_on_rate_limit創建API時,tweepy可以爲您處理速率限制(主要錯誤來源之一)。這解決了一大堆問題,所以我們會這樣做。其次,如果使用lookup_users,則每個請求可以查找100個用戶對象。我在another answer中寫過這個,所以我從那裏採取了這種方法。

最後,我們不需要創建數據框或導出到csv直到最後。如果我們獲得用戶信息詞典的列表,則可以很快更改爲DataFrame,而我們沒有真正努力。

下面是完整的代碼 - 您需要將鑰匙和用戶的用戶名實際查找,但除此之外,希望它能夠正常工作!

import tweepy 
import pandas as pd 

def lookup_user_list(user_id_list, api): 
    full_users = [] 
    users_count = len(user_id_list) 
    try: 
     for i in range((users_count/100) + 1): 
      print i 
      full_users.extend(api.lookup_users(user_ids=user_id_list[i * 100:min((i + 1) * 100, users_count)])) 
     return full_users 
    except tweepy.TweepError: 
     print 'Something went wrong, quitting...' 

consumer_key = 'XXX' 
consumer_secret = 'XXX' 
access_token = 'XXX' 
access_token_secret = 'XXX' 

auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_token_secret) 

api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True) 

ids = [] 
for page in tweepy.Cursor(api.followers_ids, screen_name="twittername").pages(): 
    ids.extend(page) 

results = lookup_user_list(ids, api) 
all_users = [{'id': user.id, 
      'Name': user.name, 
      'Statuses Count': user.statuses_count, 
      'Friends Count': user.friends_count, 
      'Screen Name': user.screen_name, 
      'Followers Count': user.followers_count, 
      'Location': user.location, 
      'Language': user.lang, 
      'Created at': user.created_at, 
      'Time zone': user.time_zone, 
      'Geo enable': user.geo_enabled, 
      'Description': user.description} 
      for user in results] 

df = pd.DataFrame(all_users) 

df.to_csv('All followers.csv', index=False, encoding='utf-8') 
+0

我編輯了我的代碼,並使用了您所建議的優化,現在我正在運行腳本,這似乎是一個很好的解決方案。感謝您的努力@ason​​gtoruin以及您投資改善代碼的時間。我很感激。 – lazurens

+0

@lazurens不用擔心朋友!如果您發現它有用,您可以用答案左側的勾號將其標記爲問題的答案 – asongtoruin

+0

這確實是我的答案,並且它修復了我沒有足夠聲望來點擊thubms的所有信息。再次感謝你。 – lazurens