2013-07-05 112 views
2

我無法始終從給定的URL獲取JSON。從URL獲取JSONOpen

jsonurl = urlopen('http://www.reddit.com/r/funny/hot.json?limit=16') 
r_content = json.load(jsonurl)['data']['children'] 

第二行的程序崩潰,有時作品只有大約60%的時間,因爲從URL中的信息是不是出於某種原因

隨着一些調試正常檢索,我發現我是從第一行得到以下錯誤:

<addinfourl at 4321460952 whose fp = <socket._fileobject object at 0x10185b050>> 

此錯誤發生的時間大約40%,當時的另外60%,代碼完美的作品。我究竟做錯了什麼?我如何讓網址更加一致?

回答

1

這通常不是客戶端的問題。您的代碼在行爲上一致,但服務器響應可能會有所不同。

我跑你的代碼幾次,它拋出了一些問題:

>>> jsonurl = urlopen('http://www.reddit.com/r/funny/hot.json?limit=16') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 406, in open 
    response = meth(req, response) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 519, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 444, in error 
    return self._call_chain(*args) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 378, in _call_chain 
    result = func(*args) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 527, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 429: Unknown 

你必須處理情況下,服務器的響應是什麼,但HTTP 200可以在try/except包裝您的代碼塊,並且只有當您的請求成功時,您才應該將jsonurl傳遞給json.loads()。

另外urlopen返回一個類似文件的描述符。因此,如果您print jsourl,它只是提供jsonurl.__repr__()值。請看下圖:

>>> jsonurl.__repr__() 
'<addinfourl at 4393153672 whose fp = <socket._fileobject object at 0x105978450>>' 

你要看看以下::

>>> jsonurl.getcode() 
200 
>>> 

且僅當它200,你應該處理從該請求獲得的數據。

+0

謝謝你的迴應非常豐富和樂於助人! – GangstaGraham