请原谅我,如果这是以前在别处回答的问题的重复,但我对如何使用tweepy API搜索功能感到迷茫。是否有关于如何使用api.search()
函数搜索推文的文档?
有什么方法可以控制返回的推文数量,结果类型等功能吗?
由于某种原因,结果似乎最高为100。
我使用的代码片段如下
searched_tweets = self.api.search(q=query,rpp=100,count=1000)
答案 0 :(得分:31)
我最初制定了基于Yuva Raj suggestion的解决方案,以使用GET search/tweets中的其他参数 - max_id
参数与{{id
在循环的每次迭代中返回的最后一条推文的1}}也检查TweepError
的出现。
但是,我发现使用tweepy.Cursor
解决问题有一种更为简单的方法(有关使用Cursor
的更多信息,请参阅tweepy Cursor tutorial)。
以下代码提取了'python'
的最新1000次提及。
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
答案 1 :(得分:13)
您的代码中存在问题。基于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
答案 2 :(得分:1)
其他问题仍然存在,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
来携带下一块。 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
答案 3 :(得分:1)
我正在为所有包含特殊关键字或关键字列表的tweet提取某个位置(此处为印度附近)的Twitter数据。
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:媒体公告关于Telangana阳性案例#COVID19的状态。 (日期为28.05.2020)
地理位置:印度海德拉巴
答案 4 :(得分:0)
您可以使用如下所示的特定字符串搜索推文:
tweets = api.search('Artificial Intelligence', count=200)