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