【问题标题】:How to get large list of followers Tweepy如何获得大量关注者 Tweepy
【发布时间】:2015-09-09 02:21:56
【问题描述】:

我正在尝试使用 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

我不断收到的错误是:

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}]

我已经查看了有关此类问题的许多其他问题,但我找不到适合我的解决方案,但如果有人有解决方案的链接,请将其发送给我!

【问题讨论】:

  • 您为什么需要发布图片?!错误消息是文本,请使用代码格式提供它。

标签: python twitter tweepy


【解决方案1】:

其实我已经想通了,所以我把解决方案贴在这里仅供参考。

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 提醒我关注速率限制。

【讨论】:

  • 我会考虑稍微超过 15 分钟,以消除您的计算机和 twitter API 之间可能存在的任何延迟。我没有实际的数字,也许是 16?我不确定 Twitter 对他们的“15 mintues”有多严格,“14:35”会好吗?只是为了安全并确保程序以最少的干扰运行。
【解决方案2】:

对此进行扩展:

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

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

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

【讨论】:

    【解决方案3】:

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

    1. 获取完整的关注者列表(使用 Twitter API 中的关注者/列表 或 tweepy 中的 api.followers) - Alec 和 mataxu 提供了 在他们的答案中使用这种方式获取的方法。速率限制 有了这个,您最多可以获得 200 * 15 = 3000 个关注者 15 分钟窗口。
    2. 第二种方法涉及两个阶段:-
      a) 首先仅获取关注者 ID(在 Twitter API 或 tweepy 中的 api.followers_ids)。你可以获得 5000 * 15 = 每 15 分钟窗口内有 75K 关注者 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 可以遵循类似的方法来获取朋友详细信息

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

    【讨论】:

    • 很好的答案,这种方法要快得多!
    • 显然这种方法不再有效。在我的情况下,对 tweepy.Cursor() 的调用在少于 100 个请求后返回 Rate limit reached. Sleeping for: 894
    • 如果你使用它显然可以工作:tweepy.Cursor(api.followers_ids, screen_name=accountvar,count=5000).items(5000)
    • 如果@Gabriel 的评论属实,你能更新你的解决方案Himanshu 吗?
    • 使用.items()而不是.items(5000)对我来说效果很好
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-03
      • 2021-08-19
      • 2013-12-22
      • 2019-02-26
      • 2016-04-29
      • 2015-02-08
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      相关资源
      最近更新 更多