【问题标题】:Twitter API - get tweets with specific idTwitter API - 获取具有特定 ID 的推文
【发布时间】:2015-04-07 16:56:47
【问题描述】:

我有一个推文 ID 列表,我想下载它们的文本内容。有什么简单的解决方案可以做到这一点,最好是通过 Python 脚本?我查看了 Tweepy 等其他库,但事情似乎并不那么简单,手动下载它们是不可能的,因为我的列表很长。

【问题讨论】:

  • 简单是什么意思?抱歉,没有这样的工具可以为您输入语音并下载推文,您必须编写代码,顺便说一句,tweepy 是目前最简单且有据可查的 twitter API 库之一。

标签: python twitter


【解决方案1】:

您可以通过 statuses/show/:id API route 的 ID 访问特定的推文。大多数 Python Twitter 库都遵循完全相同的模式,或者为方法提供“友好”的名称。

例如,Twython 提供了多个 show_* 方法,包括允许您加载特定推文的 Twython.show_status()

CONSUMER_KEY = "<consumer key>"
CONSUMER_SECRET = "<consumer secret>"
OAUTH_TOKEN = "<application key>"
OAUTH_TOKEN_SECRET = "<application secret"
twitter = Twython(
    CONSUMER_KEY, CONSUMER_SECRET,
    OAUTH_TOKEN, OAUTH_TOKEN_SECRET)

tweet = twitter.show_status(id=id_of_tweet)
print(tweet['text'])

并且返回的字典遵循API给出的Tweet object definition

tweepy library 使用tweepy.get_status()

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
api = tweepy.API(auth)

tweet = api.get_status(id_of_tweet)
print(tweet.text)

它返回一个稍微丰富的对象,但它的属性再次反映了已发布的 API。

【讨论】:

  • 谢谢,很有帮助!这正是我想要的!
【解决方案2】:

您可以使用状态/查找端点批量访问推文(一次最多 100 条):https://dev.twitter.com/rest/reference/get/statuses/lookup

【讨论】:

  • 好吧,它确实有效,但文本被截断为 140 个字符。我没有看到设置扩展模式的选项,你知道如何获取完整的推文文本吗?谢谢
【解决方案3】:

分享我之前的答案大大加速了我的工作(谢谢)。这个 Python 2.7 脚本获取存储在文件中的推文 ID 的文本。为您的输入数据格式调整 get_tweet_id(); 原始配置为https://github.com/mdredze/twitter_sandy处的数据

2018 年 4 月更新: 延迟回复 @someone 错误报告(谢谢)。该脚本不再丢弃每 100 个推文 ID(这是我的错误)。请注意,如果一条推文由于某种原因不可用,批量获取会默默地跳过它。如果响应大小与请求大小不同,脚本现在会发出警告。

'''
Gets text content for tweet IDs
'''

# standard
from __future__ import print_function
import getopt
import logging
import os
import sys
# import traceback
# third-party: `pip install tweepy`
import tweepy

# global logger level is configured in main()
Logger = None

# Generate your own at https://apps.twitter.com/app
CONSUMER_KEY = 'Consumer Key (API key)'
CONSUMER_SECRET = 'Consumer Secret (API Secret)'
OAUTH_TOKEN = 'Access Token'
OAUTH_TOKEN_SECRET = 'Access Token Secret'

# batch size depends on Twitter limit, 100 at this time
batch_size=100

def get_tweet_id(line):
    '''
    Extracts and returns tweet ID from a line in the input.
    '''
    (tagid,_timestamp,_sandyflag) = line.split('\t')
    (_tag, _search, tweet_id) = tagid.split(':')
    return tweet_id

def get_tweets_single(twapi, idfilepath):
    '''
    Fetches content for tweet IDs in a file one at a time,
    which means a ton of HTTPS requests, so NOT recommended.

    `twapi`: Initialized, authorized API object from Tweepy
    `idfilepath`: Path to file containing IDs
    '''
    # process IDs from the file
    with open(idfilepath, 'rb') as idfile:
        for line in idfile:
            tweet_id = get_tweet_id(line)
            Logger.debug('get_tweets_single: fetching tweet for ID %s', tweet_id)
            try:
                tweet = twapi.get_status(tweet_id)
                print('%s,%s' % (tweet_id, tweet.text.encode('UTF-8')))
            except tweepy.TweepError as te:
                Logger.warn('get_tweets_single: failed to get tweet ID %s: %s', tweet_id, te.message)
                # traceback.print_exc(file=sys.stderr)
        # for
    # with

def get_tweet_list(twapi, idlist):
    '''
    Invokes bulk lookup method.
    Raises an exception if rate limit is exceeded.
    '''
    # fetch as little metadata as possible
    tweets = twapi.statuses_lookup(id_=idlist, include_entities=False, trim_user=True)
    if len(idlist) != len(tweets):
        Logger.warn('get_tweet_list: unexpected response size %d, expected %d', len(tweets), len(idlist))
    for tweet in tweets:
        print('%s,%s' % (tweet.id, tweet.text.encode('UTF-8')))

def get_tweets_bulk(twapi, idfilepath):
    '''
    Fetches content for tweet IDs in a file using bulk request method,
    which vastly reduces number of HTTPS requests compared to above;
    however, it does not warn about IDs that yield no tweet.

    `twapi`: Initialized, authorized API object from Tweepy
    `idfilepath`: Path to file containing IDs
    '''    
    # process IDs from the file
    tweet_ids = list()
    with open(idfilepath, 'rb') as idfile:
        for line in idfile:
            tweet_id = get_tweet_id(line)
            Logger.debug('Enqueing tweet ID %s', tweet_id)
            tweet_ids.append(tweet_id)
            # API limits batch size
            if len(tweet_ids) == batch_size:
                Logger.debug('get_tweets_bulk: fetching batch of size %d', batch_size)
                get_tweet_list(twapi, tweet_ids)
                tweet_ids = list()
    # process remainder
    if len(tweet_ids) > 0:
        Logger.debug('get_tweets_bulk: fetching last batch of size %d', len(tweet_ids))
        get_tweet_list(twapi, tweet_ids)

def usage():
    print('Usage: get_tweets_by_id.py [options] file')
    print('    -s (single) makes one HTTPS request per tweet ID')
    print('    -v (verbose) enables detailed logging')
    sys.exit()

def main(args):
    logging.basicConfig(level=logging.WARN)
    global Logger
    Logger = logging.getLogger('get_tweets_by_id')
    bulk = True
    try:
        opts, args = getopt.getopt(args, 'sv')
    except getopt.GetoptError:
        usage()
    for opt, _optarg in opts:
        if opt in ('-s'):
            bulk = False
        elif opt in ('-v'):
            Logger.setLevel(logging.DEBUG)
            Logger.debug("main: verbose mode on")
        else:
            usage()
    if len(args) != 1:
        usage()
    idfile = args[0]
    if not os.path.isfile(idfile):
        print('Not found or not a file: %s' % idfile, file=sys.stderr)
        usage()

    # connect to twitter
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
    api = tweepy.API(auth)

    # hydrate tweet IDs
    if bulk:
        get_tweets_bulk(api, idfile)
    else:
        get_tweets_single(api, idfile)

if __name__ == '__main__':
    main(sys.argv[1:])

【讨论】:

  • 我试过你的代码,函数“statuses_lookup”没有返回任何值,甚至没有得到任何异常。你能告诉我什么可能是错的吗?
  • 它仍然对我有用,今晚测试。您是否在 apps.twitter.com 上生成了消费者密钥、消费者秘密、誓言令牌和誓言令牌秘密字符串并将它们放入脚本中?你安装了tweepy吗?您是否使用了有效的推文 ID(例如 260244087901413376)?您在哪里发布代码?
  • @chrisinmtown 感谢您的回答。我还有一个包含数千个推文 ID 的 CSV 文件,我想使用推特 API 获取推文内容)。我读了你的回答,但我有几个问题:1)你定义了几个函数(例如,get_tweets_single 和 get_tweets_bulk)。他们是获取推文的不同解决方案吗? 2)关于get_tweets_single,你提到它需要大量的HTTP请求,不推荐。由于我每月只能处理 50 个请求,您有什么建议?谢谢! :)
【解决方案4】:

我没有足够的声誉来添加实际评论,所以很遗憾这是要走的路:

我在 chrisinmtown 中发现了一个 bug 和一个奇怪的东西答案:

由于该错误,将跳过每 100 条推文。这是一个简单的解决方案:

        if len(tweet_ids) < 100:
            tweet_ids.append(tweet_id)
        else:
            tweet_ids.append(tweet_id)
            get_tweet_list(twapi, tweet_ids)
            tweet_ids = list()

使用更好,因为它甚至超过了速率限制。

api = tweepy.API(auth_handler=auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)

【讨论】:

  • 感谢某人的错误报告 - 似乎旧代码每隔 100 个 ID dangit 就会丢弃一次。哦,下次请在我的名字前使用@,以便我收到通知!
猜你喜欢
  • 1970-01-01
  • 2014-06-25
  • 2012-09-04
  • 2011-05-08
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
相关资源
最近更新 更多