从URLOpen获取JSON

时间:2013-07-05 05:22:09

标签: python json

我不能始终从给定的网址获取JSON。它只能在60%的时间内使用

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

程序有时会在第二行崩溃,因为由于某种原因无法正确检索来自网址的信息

通过一些调试,我发现我从第一行收到以下错误:

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

此错误大约发生在40%的时间,其他60%的时间,代码完美运行。我究竟做错了什么?如何使网址开放更加一致?

1 个答案:

答案 0 :(得分: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,你应该处理从请求中获得的数据。