【问题标题】:In Python, how to read Twitter messages and create .JSON file在 Python 中,如何读取 Twitter 消息并创建 .JSON 文件
【发布时间】:2015-06-16 10:43:29
【问题描述】:

前段时间我发现了一个 Python 脚本来导入 twitter 消息并将它们写入 .JSON 文件。问题是,根据我的 JSON 查看器,这不是有效的 JSON 格式。脚本是:

import twitter

twitter_api = twitter.Twitter(auth=auth)
q = "question"
count = 200


search_results = twitter_api.search.tweets(q=q, count=count, lang="nl")
statuses = search_results['statuses']


for _ in range(25): 
    try:
        next_results = search_results['search_metadata']['next_results']
    except KeyError, e: # No more results when next_results doesn't exist
        break

    kwargs = dict([ kv.split('=') for kv in next_results[1:].split("&") ]) # Create a dictionary from the query string params
    search_results = twitter_api.search.tweets(**kwargs)
    statuses += search_results['statuses']

import io
import json
import twitter


QUERY = 'question'

# The file to write output as newline-delimited JSON documents
OUT_FILE = question + "5.json"


# Write one tweet per line as a JSON document. 

with io.open(OUT_FILE, 'w', encoding='utf-8', buffering=1) as f:
    for tweet in statuses:
        f.write(unicode(u'{0}\n'.format(json.dumps(tweet, ensure_ascii=False))))
        print tweet['text']

第一条推特消息如下所示:

[{u'contributors':None,u'truncated':False,u'text':u'@ABNAMRO Bedankt voor de goede en snelle 服务! !',u'is_quote_status':False,u'in_reply_to_status_id':None,u'id':610448080702439424L,u'favorite_count':0,u'source':u'Twitter for Android',u'retweeted':False,u'coordinates':None,u'entities':{u'symbols':[],u'user_mentions':[{u'id':2270841,u'indices': [0,8],u'id_str':u'2270841',u'screen_name':u'ABNAMRO',u'name':u'ABN AMRO'}],u'hashtags':[],u'urls':[]},u'in_reply_to_screen_name':u'ABNAMRO',u'in_reply_to_user_id':2270841,u'retweet_count':0,u'id_str' :u'610448080702439424',u'favorited':False,u'user':{u'follow_request_sent':False,u'profile_use_background_image':True,u'default_profile_image':False,u'id':130104974,u'profile_background_image_url_https ':u'https://abs.twimg.com/images/themes/theme6/bg.gif',u'verified':False,u'profile_text_color':u'333333',u'profile_image_url_https':u'https://pbs.twimg.com/profile_images/457174881499889665/IkudfAL6_normal.jpeg',u'profile_sidebar_fill_color':u'A0C5C7',u'实体':{u'description':{u'urls':[]}},u'followers_count':15,u'profile_sidebar_border_color':u'86A4A6',u'id_str':u'130104974',u'profile_background_color ':u'709397',u'listed_count':0,u'is_translation_enabled':False,u'utc_offset':10800,u'statuses_count':37,u'description':u'Trotse 摩德面包车 2 dochters!',u'friends_count':52,u'location':u'Delft',u'profile_link_color':u'FF3300',u'profile_image_url':u'http://pbs.twimg.com/profile_images/457174881499889665/IkudfAL6_normal.jpeg',u'following':False, u'geo_enabled':False,u'profile_background_image_url':u'http://abs.twimg.com/images/themes/theme6/bg.gif',u'screen_name':u'Deborah_81',u'lang':u'nl',u'profile_background_tile':False,u'favourites_count' :2,u'name':u'Deborah',u'notifications':False,u'url':None,u'created_at':u'Tue 4 月 6 日 09:37:51 +0000 2010',u'contributors_enabled':False,u'time_zone':u'Athens',u'protected':False,u'default_profile':False,u'is_translator':False},u'geo':None,u 'in_reply_to_user_id_str':u'2270841',u'lang':u'nl',u'created_at':u'Mon 6 月 15 日 14:05:38 +0000 2015',u'in_reply_to_status_id_str':None,u'place':None,u'metadata':{u'iso_language_code':u'nl',u'result_type':u'recent'}}]

如何格式化消息以正确显示为 JSON?

【问题讨论】:

  • “换行分隔”“每行一条推文”不是有效的 JSON 格式。您需要将它们放在一个数组中,用 [] 包围并用逗号分隔。为什么不直接将整个 statuses 转储到 JSON 中?

标签: python json twitter


【解决方案1】:

我看到的问题是您在将数据写入 json 格式的文件之前对其进行了编码,这会给您带来错误。这应该可以解决它:

import twitter
import json

ckey = 'Your consumer key'
csecret = 'your consumer secret'
atoken = 'your token'
asecret = 'your secret token'

auth = twitter.oauth.OAuth(atoken, asecret, ckey, csecret)

twitter_api = twitter.Twitter(auth=auth)

q = "question"
count = 200


search_results = twitter_api.search.tweets(q=q, count=count, lang="nl")

statuses = search_results['statuses']


for _ in range(25): 
    try:
        next_results = search_results['search_metadata']['next_results']
    except KeyError, e: # No more results when next_results doesn't exist
        break

    kwargs = dict([ kv.split('=') for kv in next_results[1:].split("&") ]) # Create a dictionary from the query string params
    search_results = twitter_api.search.tweets(**kwargs)
    statuses += search_results['statuses']


# Obtain the text
status_texts = [ status['text']
                 for status in statuses ]

# The file to write output as newline-delimited JSON documents
OUT_FILE = q + "5.json"


# Write one tweet per line as a JSON document. 
with open(OUT_FILE, 'a') as outfile:
    json.dump(status_texts[0:], outfile)

SO这个问题以及Mining the Social Web, 2nd Edition中提到过

【讨论】:

  • 嗨 Leb,我复制了你的代码,但它生成的不是所需的文件。
  • 它产生了什么?
  • 没什么。脚本没有创建文件
  • 我编辑了脚本,请相应地编辑然后尝试运行。另外,您使用的是 2.4 还是 2.5。
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 2015-06-25
  • 1970-01-01
  • 2015-03-21
  • 2013-03-02
  • 1970-01-01
  • 2019-08-25
相关资源
最近更新 更多