以 JSON 格式获取 Tweepy 搜索结果

Posted

技术标签:

【中文标题】以 JSON 格式获取 Tweepy 搜索结果【英文标题】:Get Tweepy search results as JSON 【发布时间】:2014-07-23 01:02:21 【问题描述】:

我希望使用 Tweepy 作为 JSON 从 Twitter 获取搜索结果。 我看到here 说我应该在 Tweepy 代码中添加一个类来使这个功能起作用。

但是当我查看 Tweepy 代码时,我得到了这样的结果:

class JSONParser(Parser):

    payload_format = 'json'

    def __init__(self):
        self.json_lib = import_simplejson()

    def parse(self, method, payload):
        try:
            json = self.json_lib.loads(payload)
        except Exception, e:
            raise TweepError('Failed to parse JSON payload: %s' % e)

        needsCursors = method.parameters.has_key('cursor')
        if needsCursors and isinstance(json, dict) and 'previous_cursor' in json and 'next_cursor' in json:
            cursors = json['previous_cursor'], json['next_cursor']
            return json, cursors
        else:
            return json

    def parse_error(self, payload):
        error = self.json_lib.loads(payload)
        if error.has_key('error'):
            return error['error']
        else:
            return error['errors']

所以我没有义务破解它的代码,因为这个功能已经存在。

这就是我的代码的样子:

from tweepy.parsers import JSONParser
for tweet in tweepy.Cursor(api.search,
                       q=hashtag,
                       include_entities=True,
                       rpp=100,
                       parser=tweepy.parsers.JSONParser()
                       ).items(limit):

这是我得到的错误:

   print (json.dumps(tweet))
  File "/usr/lib/python2.7/json/__init__.py", line 243, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <tweepy.models.Status object at 0xb6df2fcc> is not JSON serializable

我应该从这个错误中理解什么?我该如何解决?

【问题讨论】:

可以在answer 中找到更好(更简单)的方法来解决类似的问题 【参考方案1】:

如果你像这样使用光标

import json
api = tweepy.API(auth)
max_tweets=100
query='Ipython'
searched_tweets = [status._json for status in tweepy.Cursor(api.search,  q=query).items(max_tweets)]
json_strings = [json.dumps(json_obj) for json_obj in searched_tweets]  

searched_tweets 是 JSON 对象列表,而 json_strings 是 JSON 字符串列表

【讨论】:

status._json 实际上是一个dict status._json 是私有成员,因此不应使用。 在 Tweepy 4.5 中我得到 AttributeError: 'API' object has no attribute 'search' 但我确实看到了例如api.search_30_day()【参考方案2】:

如果您可以在没有 Cursor 的情况下工作,则可以使用 JSONParser。但如果你能处理分页,你可以这样做:

>>> api = tweepy.API(auth, parser=tweepy.parsers.JSONParser())

确保将 rpp 更改为 count,因为 rpp 在 Twitter 搜索 API 中已过时

>>> results = api.search(q="IPython", count=100)

您将获得原始格式的结果。这意味着你会得到一个带有两个键的字典

>>> results.keys()
[u'search_metadata', u'statuses']

您可以从“statuses”值中获取搜索结果。

>>> results["statuses"]
[u'contributors': None,
  u'coordinates': None,
  u'created_at': u'Wed Oct 15 03:36:08 +0000 2014',
  ....

【讨论】:

以上是关于以 JSON 格式获取 Tweepy 搜索结果的主要内容,如果未能解决你的问题,请参考以下文章

Tweepy:现在可以使用 Twitter 搜索 API 获取旧推文?

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

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

获取 google 图片搜索页面的 JSON 版本

管理 Tweepy API 搜索

如何搜索 JSON 文件? [关闭]