如何将tweepy api调用转换为异步

时间:2019-04-11 09:20:05

标签: python asynchronous

我有一个 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()

如何以异步方式转换此代码?

1 个答案:

答案 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,以获取有关此主题的更多信息。

最诚挚的问候