如何使用 Tweepy 获取完整的 Twitter 帐户关注者列表并将其保存到文件中

How to get and save into file the full list of twitter account followers with Tweepy

我编写这段代码是为了使用 Tweepy 获取 Twitter 帐户关注者的完整列表:

# ... 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'] 

最后我在 csv 文件中只有 1000 行,将所有内容保存在内存(数据帧)上并在同一循环中将其保存到文件中并不是最佳解决方案。但至少我有一些有用的东西,但在 15000 个关注者中只有 1000 个没有得到完整列表。

如有任何帮助,我们将不胜感激。

考虑您的代码的以下部分:

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 语句的方式意味着对于每个新页面您 return,您首先 get_user 用于所有之前的页面 - 因此,当您点击 [= 的最后一页时=13=] 当您达到速率限制并且没有更多页面可供浏览时,您仍然会查看前 1000 个左右。您也可能达到光标的速率限制,这就是您看到异常的原因。

让我们重新开始。

首先,如果您使用 wait_on_rate_limittweepy 可以在您创建 API 时为您处理速率限制(主要错误来源之一)。这解决了一大堆问题,所以我们就这样做。

其次,如果使用lookup_users,每个请求可以查找100个用户对象。我在 中写过这个,所以我从那里采用了方法。

最后,直到最后我们才需要创建数据框或导出到 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')