管理Tweepy API搜索

35
请原谅我如果这是一个以前在其他地方已经回答过的问题,但我不知道如何使用 tweepy API 搜索函数。是否有关于如何使用 api.search() 函数搜索推文的文档可用?
是否有任何方法可以控制返回的推文数量、结果类型等特性?
由于某种原因,结果似乎最多只能达到 100。
我使用的代码片段如下: searched_tweets = self.api.search(q=query,rpp=100,count=1000)
5个回答

43

我最初基于Yuva Raj建议,在获取搜索/推文中使用附加参数- max_id参数与每次循环返回的最后一条推文的id结合使用,并检查TweepError的出现。

然而,我发现可以使用tweepy.Cursor更简单地解决问题(有关使用Cursor的更多信息,请参见tweepy Cursor教程)。

以下代码获取最近的1000个提到'python'的推文。

import tweepy
# assuming twitter_authentication.py contains each of the 4 oauth elements (1 per line)
from twitter_authentication import API_KEY, API_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET

auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

api = tweepy.API(auth)

query = 'python'
max_tweets = 1000
searched_tweets = [status for status in tweepy.Cursor(api.search, q=query).items(max_tweets)]

更新:为了回应安德烈·佩特雷关于tweepy.Cursor可能存在内存消耗问题的评论,我将包含我原来的解决方案,并将上面用于计算searched_tweets的单语句列表推导替换为以下内容:

searched_tweets = []
last_id = -1
while len(searched_tweets) < max_tweets:
    count = max_tweets - len(searched_tweets)
    try:
        new_tweets = api.search(q=query, count=count, max_id=str(last_id - 1))
        if not new_tweets:
            break
        searched_tweets.extend(new_tweets)
        last_id = new_tweets[-1].id
    except tweepy.TweepError as e:
        # depending on TweepError.code, one may want to retry or wait
        # to keep things simple, we will give up on an error
        break

1
如果你的内存受限,请在尝试此操作之前查看我的下面评论。 - Andrei-Niculae Petre
我已经扩展了解决方案,以解决在使用“tweepy.Cursor”时可能出现的内存消耗问题。 - gumption
使用while语句的好主意-根据我的规格进行了调整,但我喜欢它.. +1(在v3.5中使用tweepy.Cursor时遇到问题) - tech4242

15

你的代码有问题。根据Twitter的文档GET search/tweets

The number of tweets to return per page, up to a maximum of 100. Defaults to 15. This was   
formerly the "rpp" parameter in the old Search API.

您的代码应该是:

CONSUMER_KEY = '....'
CONSUMER_SECRET = '....'
ACCESS_KEY = '....'
ACCESS_SECRET = '....'

auth = tweepy.auth.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
search_results = api.search(q="hello", count=100)

for i in search_results:
    # Do Whatever You need to print here

等一下。如果我想收集5000条推文怎么办? - user3075934
3
通过更改 count 值,您可以在一次调用中获取高达 1000 条推文。一旦您进行了一次调用,并且如果您尝试使用相同的调用获取另外 1000 条推文,则只会得到相同的 1000 条推文。因此,要获取 1001-2000 条推文,您应该使用 since_idmax_id 参数。请注意,Twitter 只提供过去一周的推文,而不是两周或数月前的推文! - Yuva Raj
无论我给计数变量多少,推文的最大值都是100,这可能是我的初始点。有什么想法吗? - user3075934
4
这比其他建议都要好得多,我使用 AWS 的免费版本并受到内存限制。如果你使用 watch cat /proc/meminfo 检查 Cursor,你会发现 MemFree 一直在严格下降,没有上升和下降。所以过了半个小时我的进程被杀掉了。我的意思是,为了使其高效,使用 while loopmax_id - Andrei-Niculae Petre
@AndreiPetre 我之前没有考虑到内存消耗问题。然而,使用while循环的更长形式解决方案也应该检查错误。我扩展了我的答案,包括一个使用while循环的潜在解决方案(和最小的错误检查)。 - gumption

8

其他问题已经过时,API也发生了很多变化。

使用Cursor是一种简单的方法(请参阅Cursor教程)。Pages返回一个元素列表(您可以限制它返回的页面数。 .pages(5)只返回5页):

for page in tweepy.Cursor(api.search, q='python', count=100, tweet_mode='extended').pages():
    # process status here
    process_page(page)

在这里,q代表查询的内容,count表示请求返回的最大结果数(最多为100),tweet_mode='extended'是为了获取完整的文本内容(否则只会返回前140个字符)。更多信息请参见此处。已经确认RTs被截断,详情请见jaycech3n

如果您不想使用tweepy.Cursor,需要指定max_id来获取下一批数据。更多信息请参见此处

last_id = None
result = True
while result:
    result = api.search(q='python', count=100, tweet_mode='extended', max_id=last_id)
    process_result(result)
    # we subtract one to not have the same again.
    last_id = result[-1]._json['id'] - 1

4
我正在提取关于某个地点(在这里是印度周围)的推特数据,包括一个特定关键词或一组关键词的所有推文。
import tweepy
import credentials    ## all my twitter API credentials are in this file, this should be in the same directory as is this script

## set API connection
auth = tweepy.OAuthHandler(credentials.consumer_key, 
                            credentials.consumer_secret)
auth.set_access_secret(credentials.access_token, 
                        credentials.access_secret)
    
api = tweepy.API(auth, wait_on_rate_limit=True)    # set wait_on_rate_limit =True; as twitter may block you from querying if it finds you exceeding some limits

search_words = ["#covid19", "2020", "lockdown"]

date_since = "2020-05-21"

tweets = tweepy.Cursor(api.search, =search_words,
                       geocode="20.5937,78.9629,3000km",
                       lang="en", since=date_since).items(10)
## the geocode is for India; format for geocode="lattitude,longitude,radius"
## radius should be in miles or km


for tweet in tweets:
    print("created_at: {}\nuser: {}\ntweet text: {}\ngeo_location: {}".
            format(tweet.created_at, tweet.user.screen_name, tweet.text, tweet.user.location))
    print("\n")
## tweet.user.location will give you the general location of the user and not the particular location for the tweet itself, as it turns out, most of the users do not share the exact location of the tweet

结果:

created_at: 2020-05-28 16:48:23
user: XXXXXXXXX
tweet text: RT @Eatala_Rajender: Media Bulletin on status of positive cases #COVID19 in Telangana. (Dated. 28.05.2020)
# TelanganaFightsCorona 
# StayHom…
geo_location: Hyderabad, India

1
您可以按照下面所示的特定字符串搜索推文:
tweets = api.search('Artificial Intelligence', count=200)

Tweepy文档(http://docs.tweepy.org/en/latest/api.html)提到只会返回最多100条推文。截至当前Tweepy(≤3.8.0),指定count > 100也没有帮助。 - David C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接