2011-11-01 73 views
1

我有一個使用urllib2進行一系列url調用的python腳本。該網址位於http上,但需要進行身份驗證。我目前正在嘗試運行該腳本,以便它可以發出超過100個電話。每次運行腳本時,一些調用失敗,錯誤代碼爲401,並且有一些通過。所有通話都使用相同的用戶名和密碼。 (每次我運行這個腳本時,都是不一樣的調用失敗,有時第一次調用失敗,有時候會失敗。)從python接收401不一致的錯誤urllib2.urlopen調用

任何想法爲什麼401可能發生不一致?

顯示在屏幕上的錯誤信息是...

這裏是負責制定URL調用的方法:

def simpleExecuteRequest(minX, minY, maxX, maxY, type) : 
    url = 'http://myhost.com/geowebcache/rest/seed/mylayer.xml' 

    msgTemplate = """<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
    <seedRequest> 
    <name>mylayer</name> 
    <bounds> 
    <coords> 
    <double>%s</double> 
    <double>%s</double> 
    <double>%s</double> 
    <double>%s</double> 
    </coords> 
    </bounds> 
    <gridSetId>nyc</gridSetId> 
    <zoomStart>0</zoomStart> 
    <zoomStop>10</zoomStop> 
    <format>image/png</format> 
    <type>%s</type> 
    <threadCount>1</threadCount> 
    </seedRequest> 
    """ 

    message = msgTemplate%(minX, minY, maxX, maxY, type) 
    headers = { 'User-Agent' : "Python script", 'Content-type' : 'text/xml; charset="UTF-8"', 'Content-length': '%d' % len(message) } 
    passwordManager = urllib2.HTTPPasswordMgrWithDefaultRealm() 
    passwordManager.add_password(None, url, 'username', 'xxx') 
    authenticationHandler = urllib2.HTTPBasicAuthHandler(passwordManager) 
    proxyHandler = urllib2.ProxyHandler({}) 
    opener = urllib2.build_opener(proxyHandler, authenticationHandler) 
    urllib2.install_opener(opener)  

    try : 
     request = urllib2.Request(url, message, headers) 
     response = urllib2.urlopen(request) 
     content = response.read() 
     print 'success' 
    except IOError, e: 
     print e 

有時輸出看起來就像這樣......

<urlopen error (10053, 'Software caused connection abort')> 
success 
success 
<urlopen error (10053, 'Software caused connection abort')> 
<urlopen error (10053, 'Software caused connection abort')> 
... 

運行1分鐘後,它可能看起來像這樣...

success 
<urlopen error (10053, 'Software caused connection abort')> 
success 
success 
<urlopen error (10053, 'Software caused connection abort')> 

在兩次運行中,按相同順序提供了最小/最大x/y和類型的同一系列輸入。 ...

回答

0

該代碼看起來是正確的,所以我沒有看到問題。

下面是如何進行的一些想法:

  • 我平時工作出在將其轉化爲一個腳本之前使用curl命令行的HTTP請求。

  • requests庫更容易當您收到的響應比的urllib2

  • 使用,打印頭,所以你可以看到什麼是對

  • 去代替except IOError, e使用except IOError as e。新的方式可以保護您免受錯誤的困擾。

  • 我相信你刪節的用戶名和密碼,並使用以假亂真在自己的腳本;-)

+0

在這一點上我也同意,代碼不是問題。我添加了重試並等待邏輯到腳本中。如果我在失敗的嘗試之間休眠5秒並重試10次,我可以在單個腳本執行中成功執行所有119個請求。一些嘗試了8次嘗試,其中一些嘗試成功。不漂亮,但它完成了工作,因爲這只是一次性腳本。 –