管理 Tweepy API 搜索

Posted

技术标签:

【中文标题】管理 Tweepy API 搜索【英文标题】:Managing Tweepy API Search 【发布时间】:2014-04-23 13:32:24 【问题描述】:

如果这是对之前在其他地方回答的问题的严重重复,请原谅我,但我不知道如何使用 tweepy API 搜索功能。有没有关于如何使用api.search() 函数搜索推文的文档?

有什么方法可以控制返回的推文数量、结果类型等功能吗?

由于某种原因,结果似乎最大为 100。

我使用的代码sn-p如下

searched_tweets = self.api.search(q=query,rpp=100,count=1000)

【问题讨论】:

【参考方案1】:

您的代码有问题。基于GET search/tweets 的 Twitter 文档,

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 条推文怎么办? 通过更改 count 值,您可以在一次调用中获得多达 1000 条推文。一旦你打电话,如果你试图通过同样的方式获得另外 1000 条推文,你将只能获得相同的 1000 条推文。因此,要获得 1001 - 2000,您应该使用 since_idmax_id 参数。仅供参考,Twitter 仅提供过去一周的推文。不是两周前或几个月! 不管我给计数变量的数字是多少,推文的最大输出为 100,我猜这是我的初始点。有什么想法吗? 这比任何其他建议都要好,我使用 aws 免费层并且内存受限。如果您使用watch cat /proc/meminfo 检查Cursor 会发生什么,您会看到MemFree 严格下降,没有起伏。所以半小时后,我的进程被杀死了。我的观点是,为了提高效率,请使用while loopmax_id @AndreiPetre 我没有考虑内存消耗问题。但是,使用while 循环的较长形式的解决方案也应该检查错误。我已经扩展了我的答案,包括使用 while 循环(和最少的错误检查)的潜在解决方案。【参考方案2】:

我最初基于Yuva Raj 的suggestion 制定了一个解决方案,以在GET search/tweets 中使用附加参数-max_id 参数与在每次迭代中返回的最后一条推文的id 结合使用循环还检查 TweepError 的出现。

但是,我发现使用tweepy.Cursor 解决问题的方法要简单得多(有关使用Cursor 的更多信息,请参阅tweepy Cursor tutorial)。

以下代码获取最近 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)]

更新:为了回应Andre Petre 对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

【讨论】:

如果您的内存受限,请在尝试之前查看我的以下评论。 我已扩展解决方案以解决使用 tweepy.Cursor 时潜在的内存消耗问题。 伙计,这将是一个非常好的入门文档示例。 while 语句的好主意 - 根据我的规范对其进行了调整,但我喜欢它.. +1(在 v3.5 中出现 tweepy.Cursor 问题)【参考方案3】:

其他问题老了,API 变化很大。

简单的方法,用光标(见Cursor tutorial)。 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 个字符)更多信息here。 RT 被截断为已确认的jaycech3n。

如果你不想使用tweepy.Cursor,你需要指明max_id来带下一个chunk。 See 了解更多信息。

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】:

您可以搜索带有特定字符串的推文,如下所示:

tweets = api.search('Artificial Intelligence', count=200)

【讨论】:

Tweepy 文档 (docs.tweepy.org/en/latest/api.html) 提到最多只能返回 100 条推文。从当前的 Tweepy (≤3.8.0) 开始,指定 count > 100 没有帮助。【参考方案5】:

我正在为包含特殊关键字或关键字列表的所有推文提取某个位置(在这里,印度周围)的推特数据。

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 用户:XXXXXXXXX 推文文本:RT @Eatala_Rajender:关于特伦甘纳邦 #COVID19 阳性病例状态的媒体公告。 (日期:2020 年 5 月 28 日)

TelanganaFightsCorona

StayHom…

geo_location:印度海得拉巴

【讨论】:

以上是关于管理 Tweepy API 搜索的主要内容,如果未能解决你的问题,请参考以下文章

使用 Tweepy 搜索 Twitter 提要

以 JSON 格式获取 Tweepy 搜索结果

如何在 Tweepy 中为 API.search 的地理编码参数指定多个坐标

使用 Python Tweepy 搜索词交集和并集

tweepy.Cursor 将不相关的搜索结果返回到我选择的查询

如何忽略已在 Tweepy 中转发的推文?