簡體   English   中英

從URLOpen獲取JSON

[英]Getting JSON From URLOpen

我無法始終從給定的URL獲取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%的時間會發生錯誤,代碼可以正常工作。 我究竟做錯了什么? 如何使網址打開更加一致?

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

我運行了幾次您的代碼,它確實引發了某些問題:

>>> 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時,才應處理從請求中獲得的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM