2013-07-05 2 views
2

Я не могу последовательно получать JSON с заданного URL-адреса. Он работает только около 60% времениПолучение JSON Из URLOpen

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-адрес более последовательным?

ответ

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