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

时间:2017-06-13 14:19:09

标签: python-2.7 web-scraping 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个完整列表。

对此有任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

考虑代码的以下部分:

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个左右。您也可能达到光标的速率限制,这就是您看到异常的原因。

让我们重新开始吧。

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

其次,如果您使用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')