urllib2.urlopen因未知原因而崩溃

时间:2014-05-24 19:55:38

标签: python urllib2

我有一些代码与此处使用的代码非常相似:

https://github.com/jeysonmc/python-google-speech-scripts/blob/master/stt_google.py

这是我的代码:

    f = open(filename, 'rb')
    speech = f.read()
    f.close()


    LANG_CODE = 'en-US'  # Language to use
    GOOGLE_SPEECH_URL = 'https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&pfilter=2&lang=%s&maxresults=6' % (LANG_CODE)


    f = open(filename, 'rb')
    flac_cont = f.read()
    f.close()

    hrs = {"User-Agent": "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7", 
       'Content-type': 'audio/x-flac; rate=16000'}  

    req = urllib2.Request(GOOGLE_SPEECH_URL, data=flac_cont, headers=hrs)
    print "Sending request to Google TTS"
    p = urllib2.urlopen(req)
    response = p.read()
    print "response", response
    res = eval(response)['hypotheses']

似乎陷入了urllib2.urlopen(req)行。它给出了这个错误:

Traceback (most recent call last):
  File "google-speech.py", line 443, in <module>
    GoogleSpeech.text_from_speech(filename)
  File "google-speech.py", line 274, in text_from_speech
    p = urllib2.urlopen(req)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 410, in open
    response = meth(req, response)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad Request

我不确定问题是什么

编辑:添加了我的回溯的结尾,这是之前遗漏的

2 个答案:

答案 0 :(得分:2)

如果错误是随机发生的,您可以使用优雅的重试算法,例如此处实现的算法:

https://wiki.python.org/moin/PythonDecoratorLibrary#Retry

这个想法是,如果例如URL当前无法访问,则不要盲目地重试,但是增加重试间隔以允许目标位置恢复,并且如果无法打开URL则最终退避一点都不。

如果每次都发生错误,则会遇到其他问题,并且应该发布完整的堆栈跟踪。

答案 1 :(得分:1)

这就是我要克服这个问题的方法:

while True:
    try:
        p = urllib2.urlopen(req)
        break
     except Exception as e:
        print(e, 'Trying again...')