2017-03-08 102 views
0

我嘗試使用包含在tweet文本中的指定關鍵字來查詢指定用戶的推文。這裏是我的代碼:使用Python和Tweepy查詢Twitter狀態

# Import Tweepy, sleep, credentials.py 
import tweepy 
from time import sleep 
from credentials import * 

# Access and authorize our Twitter credentials from credentials.py 
auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_token_secret) 
api = tweepy.API(auth) 

SCREEN_NAME = "BachelorABC" 
KEYWORD = "TheBachelor" 

def twtr2(): 
    raw_tweets = tweepy.Cursor(api.search, q=KEYWORD, lang="en").items(50) 
    for tweet in raw_tweets: 
     if tweet['user']['screen_name'] == SCREEN_NAME: 
      print tweet 
twtr2() 

我得到如下錯誤信息:

Traceback (most recent call last): 
    File "test2.py", line 19, in <module> 
    twtr2() 
    File "test2.py", line 17, in twtr2 
    if tweet['user']['screen_name'] == SCREEN_NAME: 
TypeError: 'Status' object has no attribute '__getitem__' 

我GOOGLE了很多,想,也許我需要保存Twitter的JSON在Python第一,所以我嘗試以下:

import tweepy, json 
from time import sleep 
from credentials import * 

auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_token_secret) 
api = tweepy.API(auth) 

SCREEN_NAME = "BachelorABC" 
KEYWORD = "TheBachelor" 

raw_tweets = tweepy.Cursor(api.search, q=KEYWORD, lang="en").items(50) 
for tweet in raw_tweets: 
    load_tweet = json.loads(tweet) 
    if load_tweet['user']['screen_name'] == SCREEN_NAME: 
     print tweet 

但是,結果是可悲的:

Traceback (most recent call last): 
    File "test2.py", line 35, in <module> 
    load_tweet = json.loads(tweet) 
    File "C:\Python27\lib\json\__init__.py", line 339, in loads 
    return _default_decoder.decode(s) 
    File "C:\Python27\lib\json\decoder.py", line 364, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
TypeError: expected string or buffer 

有人知道我的代碼有什麼問題嗎?你能幫我解決它嗎?

提前致謝!

回答

1

我想通了。這裏是解決方案:

# Import Tweepy, sleep, credentials.py 
import tweepy 
from time import sleep 
from credentials import * 

# Access and authorize our Twitter credentials from credentials.py 
auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_token_secret) 
api = tweepy.API(auth) 

SCREEN_NAME = "BachelorABC" 
KEYWORD = "TheBachelor" 
for tweet in tweepy.Cursor(api.search, q=KEYWORD, lang="en").items(200): 
    if tweet.user.screen_name == SCREEN_NAME: 
     print tweet.text 
     print tweet.user.screen_name 

請注意,這是不是找到同時指定條件(SCREEN_NAME和關鍵字)滿意的鳴叫的有效途徑。這是因爲我們先按關鍵字查詢,然後再按screen_name查詢。如果關鍵字非常流行,就像我在這裏使用的「TheBachelor」一樣,只有有限的推文(200),我們可能會發現200個推文中沒有一個是由指定的screen_name發送的。我想如果我們可以先通過screen_name查詢,然後再通過關鍵字查詢,也許它會提供更好的結果。但是這沒有討論。

我會離開你在這裏。

0

的問題是與

load_tweet = json.loads(tweet) 

的 「推特」 的對象不是一個JSON對象。如果您想使用JSON對象,請參閱此stackoverflow文章,瞭解如何使用帶有tweepy的JSON對象。

要達到什麼樣的你正在嘗試做的(打印50提供的每一鳴叫),我將遵循什麼樣的getting started docs指出:

import tweepy 

auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_token_secret) 

api = tweepy.API(auth) 

public_tweets = api.home_timeline() 
for tweet in public_tweets: 
    print(tweet.text) 
+0

感謝您的時間@ethanchewy我正在尋找帶有**指定** screen_name和關鍵字的推文。一般來說,你的回答是關於前20條推文。你有什麼想法找到這些條件的推文嗎? – Counter10000

+0

@LinguisticsStudent看看位於這裏的最後一個代碼片段:https://github.com/tweepy/tweepy/blob/master/docs/code_snippet.rst。您可以將screen_names存儲在列表中,然後在該列表中搜索某個screen_name。 請注意,Twitter對查詢有嚴格的限制。 – ethanchewy

+0

謝謝@ethanchewy。上面引用的頁面是從追隨者或用戶檢索screen_name,而不是狀態。如果我稍後再找到答案,我會更新。 – Counter10000