2013-07-05 61 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