【问题标题】:Query Twitter Status by Using Python and Tweepy使用 Python 和 Tweepy 查询 Twitter 状态
【发布时间】:2017-07-28 11:31:40
【问题描述】:

我尝试使用包含在推文文本中的指定关键字来查询指定用户的推文。这是我的代码:

# 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了很多,想也许我需要先用python保存Twitter的JSON,所以我尝试了以下方法:

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

有人知道我的代码有什么问题吗?你能帮我解决它吗?

提前致谢!

【问题讨论】:

    标签: python json twitter tweepy


    【解决方案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查询。如果关键字非常流行,比如我在这里使用的“TheBachelor”,推文数量有限(200 条),我们可能会发现 200 条推文中没有一条是由指定的 screen_name 发送的。我想如果我们可以先按screen_name,然后按关键字查询,也许会提供更好的结果。但这不在讨论范围内。

    我会把你留在这里。

    【讨论】:

      【解决方案2】:

      问题出在

      load_tweet = json.loads(tweet)
      

      “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)
      

      【讨论】:

      • 感谢您抽出宝贵时间@ethanchewy 我正在寻找带有 specified 屏幕名称和关键字的推文。您的回答通常是关于前 20 条推文。您是否有任何想法找到具有这些条件的推文?
      • @LinguisticsStudent 看看这里的最后一个代码 sn-p:github.com/tweepy/tweepy/blob/master/docs/code_snippet.rst。您可以将 screen_names 存储在一个列表中,然后在该列表中搜索某个 screen_name。请注意,Twitter 对查询有严格的限制。
      • 谢谢@ethanchewy。您在上面引用的页面是从关注者或用户那里检索屏幕名称,而不是状态。如果我稍后找到答案,我会更新。
      • 仅供参考,@ethanchewy 我在上面发布了我的答案。
      猜你喜欢
      • 2018-01-22
      • 2013-07-17
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2023-04-08
      • 2016-11-08
      • 1970-01-01
      • 2017-10-13
      相关资源
      最近更新 更多