如何获得大量关注者Tweepy

时间:2015-06-23 10:22:15

标签: python twitter tweepy

我正在尝试使用Tweepy从500k粉丝的帐户中获取完整的关注者列表,并且我有一个代码可以为我提供较小帐户的用户名,例如100以下,但如果我得到一个甚至是100像110粉丝一样,它不起作用。任何有助于确定如何使其使用更大数字的帮助非常感谢!

这是我现在的代码:

import tweepy
import time

key1 = "..."
key2 = "..."
key3 = "..."
key4 = "..."

accountvar = raw_input("Account name: ")

auth = tweepy.OAuthHandler(key1, key2)
auth.set_access_token(key3, key4)

api = tweepy.API(auth)

ids = []
for page in tweepy.Cursor(api.followers_ids, screen_name=accountvar).pages():
     ids.extend(page)
     time.sleep(60)

users = api.lookup_users(user_ids=ids)
for u in users:
     print u.screen_name

我不断得到的错误是:

Traceback (most recent call last):
  File "test.py", line 24, in <module>
    users = api.lookup_users(user_ids=ids)
  File "/Library/Python/2.7/site-packages/tweepy/api.py", line 321, in lookup_users
    return self._lookup_users(post_data=post_data)
  File "/Library/Python/2.7/site-packages/tweepy/binder.py", line 239, in _call
    return method.execute()
  File "/Library/Python/2.7/site-packages/tweepy/binder.py", line 223, in execute
    raise TweepError(error_msg, resp)
tweepy.error.TweepError: [{u'message': u'Too many terms specified in query.', u'code': 18}]

我已经查看过关于此类问题的其他一些问题,但我找不到任何有效的解决方案,但如果有人有解决方案的链接,请发送给我!

4 个答案:

答案 0 :(得分:9)

我实际想出来了,所以我在这里发布解决方案仅供参考。

import tweepy
import time

key1 = "..."
key2 = "..."
key3 = "..."
key4 = "..."

accountvar = raw_input("Account name: ")

auth = tweepy.OAuthHandler(key1, key2)
auth.set_access_token(key3, key4)

api = tweepy.API(auth)

users = tweepy.Cursor(api.followers, screen_name=accountvar).items()

while True:
    try:
        user = next(users)
    except tweepy.TweepError:
        time.sleep(60*15)
        user = next(users)
    except StopIteration:
        break
    print "@" + user.screen_name

每隔300个名字停留15分钟后停止,然后继续。这可以确保它不会遇到问题。对于大型账户来说,这显然需要很长时间,但正如Leb所说:

  

twitter API一次只能搜索100个用户... [所以]你需要做的是遍历每100个用户但仍然在速率限制范围内。

如果你想要下一组,你基本上只需要让程序保持运行。我不知道为什么我的一次只给300而不是100,但正如我之前提到的那样,它早先给了我100个。

希望这可以帮助其他与我有同样问题的人,并向Leb致敬,提醒我关注速度限制。

答案 1 :(得分:5)

延伸到此:

您可以通过添加计数参数每15分钟收集3,000个用户:

users = tweepy.Cursor(api.followers, screen_name=accountvar, count=200).items()

这将根据您的版本调用Twitter API 15次,但不是默认计数= 20,每个API调用将返回200(即您获得3000而不是300)。

答案 2 :(得分:1)

twitter API一次只能搜索100个用户。这就是为什么无论你输入了多少,你都会得到100分。followers_id给你正确数量的用户,但你被GET users/lookup限制

您需要做的是遍历每100个用户,但要保持在速率限制范围内。

答案 3 :(得分:0)

Twitter提供了两种获取关注者的方法:-

  1. 获取完整的关注者列表(使用Twitter API中的关注者/列表) 或tweepy中的api.followers)-Alec和mataxu提供了 他们的答案中使用这种方式获取的方法。速率限制 这样一来,您每获得最多200 * 15 = 3000个关注者 15分钟的窗口。
  2. 此方法分为两个部分:-
     a)首先仅获取关注者ID(在中使用关注者/ ID Twitter API或tweepy中的api.followers_ids)。您可以获得5000 * 每15分钟的窗口中有15个= 75,000个关注者ID。

    b)抬头 他们的用户名或其他数据(在twitter api中使用用户/查找或 tweepy中的api.lookup_users)。速率限制约为100 * 180 =每15分钟窗口18K查询。

考虑到速率限制,第二种方法使跟随者的数据比第一种方法快6倍。 以下是可以使用第二种方法执行此操作的代码:-

#First, Make sure you have set wait_on_rate_limit to True while connecting through Tweepy
api = tweepy.API(auth, wait_on_rate_limit=True,wait_on_rate_limit_notify=True)

#Below code will request for 5000 follower ids in one request and therefore will give 75K ids in every 15 minute window (as 15 requests could be made in each window).
followerids =[]
for user in tweepy.Cursor(api.followers_ids, screen_name=accountvar,count=5000).items():
    followerids.append(user)    
print (len(followerids))

#Below function could be used to make lookup requests for ids 100 at a time leading to 18K lookups in each 15 minute window
def get_usernames(userids, api):
    fullusers = []
    u_count = len(userids)
    print(u_count)
    try:
        for i in range(int(u_count/100) + 1):            
            end_loc = min((i + 1) * 100, u_count)
            fullusers.extend(
                api.lookup_users(user_ids=userids[i * 100:end_loc])                
            )
        return fullusers
    except:
        import traceback
        traceback.print_exc()
        print ('Something went wrong, quitting...')

#Calling the function below with the list of followeids and tweepy api connection details
fullusers = get_usernames(followerids,api)

希望这会有所帮助。 可以使用类似的方法通过使用api.friends_ids代替api.followers_ids来获取朋友的详细信息

如果您需要更多资源来进行速率限制比较和第二种方法,请查看以下链接:-