2011-11-01 55 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次尝试,其中一些尝试成功。不漂亮,但它完成了工作,因为这只是一次性脚本。 –