2017-03-08 65 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