Tweepy:如何查找超过 100 个用户的屏幕名称
Tweepy: How can I look up more than 100 user screen names
您只能retrieve 100 user objects per request与
api.lookup_users()
方法。有没有一种简单的方法可以使用 Tweepy 和 Python 检索超过 100 个?我读过这个 post: 但它对超过 100 的问题没有帮助。我是 Python 的新手,所以我无法自己想出解决方案。我试过的是:
users = []
i = 0
num_pages = 2
while i < num_pages:
try:
# Look up a collection of ids
users.append(api.lookup_users(user_ids=ids[100*i:100*(i+1)-1]))
except tweepy.TweepError:
# We get a tweep error
print('Something went wrong, quitting...')
i = i + 1
其中 ids
是一个包含 ID 的列表,但是当我尝试获取索引高于 100 的用户时,我得到 IndexError: list index out of range
。如果有帮助,我只对获取屏幕感兴趣来自用户 ID 的名称。
我没有测试它,因为我无法访问 API。
但是,如果您有任何范围内的用户 ID 集合,这应该会获取所有这些用户 ID。
它首先提取任何余数,这意味着如果您有一个包含 250 个 ID 的列表,它将提取列表中最后 50 个 ID 的 50 个用户。
然后它将以数百个为一批提取剩余的 200 个用户。
from tweepy import api, TweepError
users = []
user_ids = [] # collection of user ids
count_100 = int(len(user_ids) / 100) # amount of hundred user ids
if len(user_ids) % 100 > 0:
for i in range(0, count_100 + 1):
try:
if i == 0:
remainder = len(user_ids) % 100
users.append(api.lookup_users(user_ids=user_ids[:-remainder]))
else:
end_at = i * 100
start_at = end_at - 100
users.append(api.lookup_users(user_ids=user_ids[start_at:end_at]))
except TweepError:
print('Something went wrong, quitting...')
你是对的,你需要将推文以 100 条为一批发送到 API,但你忽略了一个事实,即你可能没有 100 条推文的精确倍数。尝试以下操作:
import tweepy
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):
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...'
results = lookup_user_list(ids, api)
通过取 results = lookup_user_list(user_ids, main_api)
中的最小值,我们确保最终循环只获取剩余的用户。 results
将是查找用户的列表。
您也可能会遇到速率限制 - 在设置您的 API 时,您应该注意让 tweepy 优雅地捕获这些并删除一些艰苦的工作,如下所示:
consumer_key = 'X'
consumer_secret = 'X'
access_token = 'X'
access_token_secret = 'X'
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)
您只能retrieve 100 user objects per request与
api.lookup_users()
方法。有没有一种简单的方法可以使用 Tweepy 和 Python 检索超过 100 个?我读过这个 post:
users = []
i = 0
num_pages = 2
while i < num_pages:
try:
# Look up a collection of ids
users.append(api.lookup_users(user_ids=ids[100*i:100*(i+1)-1]))
except tweepy.TweepError:
# We get a tweep error
print('Something went wrong, quitting...')
i = i + 1
其中 ids
是一个包含 ID 的列表,但是当我尝试获取索引高于 100 的用户时,我得到 IndexError: list index out of range
。如果有帮助,我只对获取屏幕感兴趣来自用户 ID 的名称。
我没有测试它,因为我无法访问 API。
但是,如果您有任何范围内的用户 ID 集合,这应该会获取所有这些用户 ID。
它首先提取任何余数,这意味着如果您有一个包含 250 个 ID 的列表,它将提取列表中最后 50 个 ID 的 50 个用户。
然后它将以数百个为一批提取剩余的 200 个用户。
from tweepy import api, TweepError
users = []
user_ids = [] # collection of user ids
count_100 = int(len(user_ids) / 100) # amount of hundred user ids
if len(user_ids) % 100 > 0:
for i in range(0, count_100 + 1):
try:
if i == 0:
remainder = len(user_ids) % 100
users.append(api.lookup_users(user_ids=user_ids[:-remainder]))
else:
end_at = i * 100
start_at = end_at - 100
users.append(api.lookup_users(user_ids=user_ids[start_at:end_at]))
except TweepError:
print('Something went wrong, quitting...')
你是对的,你需要将推文以 100 条为一批发送到 API,但你忽略了一个事实,即你可能没有 100 条推文的精确倍数。尝试以下操作:
import tweepy
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):
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...'
results = lookup_user_list(ids, api)
通过取 results = lookup_user_list(user_ids, main_api)
中的最小值,我们确保最终循环只获取剩余的用户。 results
将是查找用户的列表。
您也可能会遇到速率限制 - 在设置您的 API 时,您应该注意让 tweepy 优雅地捕获这些并删除一些艰苦的工作,如下所示:
consumer_key = 'X'
consumer_secret = 'X'
access_token = 'X'
access_token_secret = 'X'
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)