我有一个 98000 + 个Twitter句柄列表。使用tweepy我想获取特定用户的一些信息,例如用户名,描述等。 对于这种数据量,我所遵循的方法确实很慢。所以我想实现asyncio。
我目前正在遍历高音手柄的列表,并获取每个手柄的数据。
我的代码如下
# import tweeter API credentials
import credentials as c
# import tweeter user handles fetched from DB
import get_handles
# import required modules
import json
import tweepy
# List of tweeter handles
handles = get_handles.twitter_handles
# authentication
auth = tweepy.OAuthHandler(c.API_KEY, c.API_SECRET_KEY)
auth.set_access_token(c.ACCESS_TOKEN, c.ACCESS_TOKEN_SECRET)
api = tweepy.API(auth, timeout=5)
# open a file inorder to write data fetched from API
with open('userinfo2.json', 'w') as outfile:
for x in range(9508, len(handles)):
user = api.get_user(handles[x])
data = {
'name': user.name, 'description': user.description,
'profile_image_url': user.profile_image_url,
'followers_count': user.followers_count,
}
json.dump(data, outfile, indent=4)
print('%s number of data fetched', (x))
outfile.close()
如何以异步方式转换此代码?
答案 0 :(得分:1)
我正在通过tweepy.API使用包装器来实现这一目标
# atweepy.py
import asyncio
import functools
import tweepy # type: ignore
from tweepy import *
async def acall(f, *args, **kwargs):
return await asyncio.get_running_loop().run_in_executor(
None, lambda: f(*args, **kwargs)
)
def awrap(f):
@functools.wraps(f)
async def wrapper(*args, **kwargs):
return await acall(f, *args, **kwargs)
return wrapper
def create_aproxy_class(cls):
class AsyncProxy:
__name__ = cls.__name__
__doc__ = cls.__doc__
def __init__(self, *args, **kwargs):
self.proxy = cls(*args, **kwargs)
def __getattr__(self, attr):
attr = getattr(self.proxy, attr)
return awrap(attr) if callable(attr) else attr
return AsyncProxy
API = create_aproxy_class(tweepy.API)
并创建API
import atweepy
async def create_twitter(key, secret, access_token, access_token_secret):
try:
auth = atweepy.OAuthHandler(key, secret)
except tweepy.TweepError:
return
auth.set_access_token(access_token, access_token_secret)
api = atweepy.API(
auth,
retry_count=3,
retry_delay=10,
wait_on_rate_limit_notify=True,
wait_on_rate_limit=True,
compression=True,
)
return api
然后调用您必须 放置任何await
的任何API方法。
api = create_api(key, secret, access_token, access_token_secret)
me = await api.me()
tweet = await api.get_status(some_id)
tl = await api.mentions_timeline()
这将使用.run_in_executor
调用包装所有API方法。这不是理想的方法,但是对我有用。请查看https://github.com/tweepy/tweepy/issues/732,以获取有关此主题的更多信息。
最诚挚的问候