如何获得大量关注者Tweepy

mat*_*axu 2 python twitter tweepy

我正在尝试使用Tweepy从500k粉丝的帐户中获取完整的关注者列表,并且我有一个代码可以为我提供较小帐户的用户名,例如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
Run Code Online (Sandbox Code Playgroud)

我一直得到的错误是:

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}]
Run Code Online (Sandbox Code Playgroud)

我已经看了很多关于这类问题的其他问题,但我找不到一个对我有用的解决方案,但如果有人有解决方案的链接,请发给我!

mat*_*axu 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
Run Code Online (Sandbox Code Playgroud)

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

twitter API只允许一次搜索100个用户... [所以]你需要做的是遍历每100个用户,但保持在速率限制内.

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

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

  • 我会考虑用 15 分钟多一点的时间来消除您的计算机和 Twitter API 之间任何可能的延迟。我没有实际数字,也许是 16?我不确定 Twitter 对他们的“15 分钟”有多严格,“14:35”会好吗?只是为了安全并确保程序以最少的干扰运行。 (2认同)

Him*_*tha 8

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

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

    b) 查找他们的用户名或其他数据(在 twitter api 中使用 users/lookup 或在 tweepy 中使用 api.lookup_users)。这具有每 15 分钟窗口大约 100 * 180 = 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)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 很好的答案,这种方法要快得多! (2认同)

Ale*_*lec 6

为此扩展:

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

users = tweepy.Cursor(api.followers, screen_name=accountvar, count=200).items()
Run Code Online (Sandbox Code Playgroud)

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


Leb*_*Leb 1

Twitter API 一次只允许搜索 100 个用户。这就是为什么无论您输入多少,您都会得到 100。这followers_id为您提供了正确的用户数量,但您受到GET 用户/查找的限制

您需要做的是迭代每 100 个用户,但保持在速率限制之内。