首页 > 解决方案 > 如何在 Sandbox 版本中使用 Twitter Premium Search API 检索所有历史公共推文(使用下一个令牌)

问题描述

我想为研究项目下载所有带有特定主题标签和/或关键字的历史推文。我为此获得了高级 Twitter API。我正在使用惊人TwitterAPI的来处理身份验证等。

我现在的问题是我不是专家开发人员,我在理解next令牌的工作原理以及如何在 csv 中获取所有推文时遇到了一些问题。

我想要实现的是将所有推文放在一个 csv 中,而无需手动更改fromDatetoDate值的日期。现在我不知道如何获取next令牌以及如何使用它来连接请求。

到目前为止,我到了这里:

from TwitterAPI import TwitterAPI
import csv

SEARCH_TERM = 'my-search-term-here'
PRODUCT = 'fullarchive'
LABEL = 'here-goes-my-dev-env'

api = TwitterAPI("consumer_key", 
             "consumer_secret", 
             "access_token_key", 
             "access_token_secret")

r = api.request('tweets/search/%s/:%s' % (PRODUCT, LABEL), 
            {'query':SEARCH_TERM, 
            'fromDate':'200603220000',
            'toDate':'201806020000'
            }
            )
csvFile = open('2006-2018.csv', 'a')
csvWriter = csv.writer(csvFile)

for item in r:
    csvWriter.writerow([item['created_at'],item['user']['screen_name'], item['text'] if 'text' in item else item])

我会非常感谢任何帮助!干杯!

标签: python-3.xapitwitter

解决方案


首先,TwitterAPI包含一个帮助程序类,它将为您处理这个问题。TwitterPager适用于多种类型的 Twitter 端点,而不仅仅是高级搜索。这是一个让您入门的示例:https ://github.com/geduldig/TwitterAPI/blob/master/examples/page_tweets.py

但是要回答您的问题,您应该采取的策略是将您当前的请求放入while循环中。然后, 1. 每个请求都会返回一个next字段,您可以使用r.json()['next']. 2. 当您处理完当前批次的推文并准备好下一个请求时,您将包含next设置为上述值的参数。3. 最后,最终一个请求不会next在返回的json中包含a。在这一点上打破while循环。

类似于以下内容。

next = ''
while True:
    r = api.request('tweets/search/%s/:%s' % (PRODUCT, LABEL), 
                    {'query':SEARCH_TERM, 
                     'fromDate':'200603220000',
                     'toDate':'201806020000',
                     'next':next})
    if r.status_code != 200:
        break
    for item in r:
        csvWriter.writerow([item['created_at'],item['user']['screen_name'], item['text'] if 'text' in item else item])
    json = r.json()
    if 'next' not in json:
        break
    next = json['next']

推荐阅读