Skip to main content
 首页 » 编程设计

python之从 URL 打开获取 JSON

2025年05月04日8qq78292959

我无法始终如一地从给定的 url 获取 JSON。它只有大约 60% 的时间有效

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

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

经过一些调试,我发现第一行出现了以下错误:

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

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

请您参考如下方法:

这通常不是客户端的问题。您的代码在行为上是一致的,但服务器响应可能会有所不同。

我运行了几次你的代码,它确实抛出了一些问题:

>>> 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 block 中,并且您应该传递 jsonurl 到 json.loads() 仅当您的请求成功时。

同时 urlopen 返回一个类似文件的描述符。因此,如果您 print jsurl,它只是提供 jsonurl.__repr__() 值。见下文:

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

您必须寻找以下内容::

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

只有当它为 200 时,您才应该处理从请求中获得的数据。