我编写此代码以使用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个完整列表。
对此有任何帮助将不胜感激。
答案 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个左右。您也可能达到光标的速率限制,这就是您看到异常的原因。
让我们重新开始吧。
首先,如果您使用tweepy
,wait_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')