2014-09-19 47 views
0

我正在使用Python向文件輸出Twitter流(「https://stream.twitter.com/1.1/statuses/filter.json?track=term」)。但是,該文件是輸出的,而不是一個「JSON」,「實例」(見粗體相關部分):Streaming API狀態/ filter.json?跟蹤未提供JSON Python

import oauth2 as oauth 
import urllib2 as urllib 
import json 

# Filled correctly, no authentication problem 
api_key = "XXX" 
api_secret = "XXX" 
access_token_key = "XXX" 
access_token_secret = "XXX" 


_debug = 0 

oauth_token = oauth.Token(key=access_token_key, secret=access_token_secret) 
oauth_consumer = oauth.Consumer(key=api_key, secret=api_secret) 

signature_method_hmac_sha1 = oauth.SignatureMethod_HMAC_SHA1() 

http_method = "GET" 


http_handler = urllib.HTTPHandler(debuglevel=_debug) 
https_handler = urllib.HTTPSHandler(debuglevel=_debug) 

''' 
Construct, sign, and open a twitter request 
using the hard-coded credentials above. 
''' 
def twitterreq(url, method, parameters): 
    req = oauth.Request.from_consumer_and_token(oauth_consumer, 
              token=oauth_token, 
              http_method=http_method, 
              http_url=url, 
              parameters=parameters) 

    req.sign_request(signature_method_hmac_sha1, oauth_consumer, oauth_token) 

    headers = req.to_header() 

    if http_method == "POST": 
    encoded_post_data = req.to_postdata() 
    else: 
    encoded_post_data = None 
    url = req.to_url() 

    opener = urllib.OpenerDirector() 
    opener.add_handler(http_handler) 
    opener.add_handler(https_handler) 

    response = opener.open(url, encoded_post_data) 

    return response 


**def fetchcontinuousstream(): 
    # For streaming of tweets use 
    url = "https://stream.twitter.com/1.1/statuses/filter.json?track=term" 
    parameters = [] 
    response = twitterreq(url, "GET", parameters) 
    print "Type of the response" 
    print type(response) 
    for line in response: 
    print type(line) 


if __name__ == '__main__': 
    fetchcontinuousstream()** 

結果是這樣的:

Type of the response 
<type 'instance'> 
<type 'str'> 

所以基本上響應是一個實例,不是一個JSON/Dict,每一行只是一個字符串...

我該如何獲得JSON呢?

回答

0

嘗試解析與json.loads

import oauth2 as oauth 
import urllib2 as urllib 
from json import loads 

# Filled correctly, no authentication problem 
api_key = "xxxx" 
api_secret = "xxxx" 
access_token_key = "xxxx" 
access_token_secret = "xxxx" 


_debug = 0 

oauth_token = oauth.Token(key=access_token_key, secret=access_token_secret) 
oauth_consumer = oauth.Consumer(key=api_key, secret=api_secret) 

signature_method_hmac_sha1 = oauth.SignatureMethod_HMAC_SHA1() 

http_method = "GET" 


http_handler = urllib.HTTPHandler(debuglevel=_debug) 
https_handler = urllib.HTTPSHandler(debuglevel=_debug) 


def twitterreq(url, method, parameters): 
    '''Construct, sign, and open a twitter request 
    using the hard-coded credentials above. 
    ''' 
    req = oauth.Request.from_consumer_and_token(oauth_consumer, 
               token=oauth_token, 
               http_method=http_method, 
               http_url=url, 
               parameters=parameters) 

    req.sign_request(signature_method_hmac_sha1, oauth_consumer, oauth_token) 

    if http_method == "POST": 
     encoded_post_data = req.to_postdata() 
    else: 
     encoded_post_data = None 

    url = req.to_url() 

    opener = urllib.OpenerDirector() 
    opener.add_handler(http_handler) 
    opener.add_handler(https_handler) 

    response = opener.open(url, encoded_post_data) 

    return response 

def fetchcontinuousstream(): 
    # For streaming of tweets use 
    url = "https://stream.twitter.com/1.1/statuses/filter.json?track=term" 
    parameters = [] 
    response = twitterreq(url, "GET", parameters) 
    for line in response: 
     print loads(line) 

if __name__ == '__main__': 
    fetchcontinuousstream() 
+0

謝謝回答,如果我嘗試這個代碼: 'response = json.loads(twitterreq(url,「GET」,parameters))' 它不起作用: 'File「print.py」, line 64,in fetchcontinuousstream response = json.loads(twitterreq(url,「GET」,parameters)) 文件「/usr/lib/python2.7/json/__init__.py」,第326行,載入中 return _default_decoder .decode(s) 解壓縮文件「/usr/lib/python2.7/json/decoder.py」,第366行 obj,end = self.raw_decode(s,idx = _w(s,0).end ()) 類型錯誤:預期字符串或buffer' – user1064285 2014-09-19 14:25:46

+0

如果我上線加負載()代替: '用於響應行: 鳴叫= json.loads(線)' 它不工作之一:在提取連續流 tweet = jso n.loads(line) 文件「/usr/lib/python2.7/json/__init__.py」,第326行,載入中 return _default_decoder.decode(s) 文件「/usr/lib/python2.7/ json/decoder.py「,第366行,解碼爲 obj,end = self.raw_decode(s,idx = _w(s,0).end()) 文件」/usr/lib/python2.7/json/解碼器.py「,第384行,在raw_decode中 raise ValueError(」沒有JSON對象可以被解碼「) ValueError:沒有JSON對象可以被解碼' – user1064285 2014-09-19 14:29:54

+0

對不起,修復答案。 – 2014-09-19 16:11:12

0

響應JSON的裝載機在讀一個空行,未能解碼,這個代碼將工作

def fetchcontinuousstream(): 
    # For streaming of tweets use 
    url = "https://stream.twitter.com/1.1/statuses/filter.json?track=term" 
    parameters = [] 
    response = twitterreq(url, "GET", parameters) 
    for line in response: 
    if line != "": 
     tweet = json.loads(line) 
     print tweet["text"]