从python urllib2.urlopen调用不一致地接收401个错误

从python urllib2.urlopen调用不一致地接收401个错误,python,urllib2,Python,Urllib2,我有一个python脚本,它使用urllib2进行一系列url调用。url位于http上,但需要身份验证。我目前正在尝试运行脚本,这样它将发出100多个调用。每次我运行脚本时,有些调用都会失败,错误代码为401,有些则会通过。所有调用都使用相同的用户名和密码针对相同的URL。(每次我运行脚本时,失败的调用并不相同,有时第一次调用失败,有时可以正常工作。) 你知道为什么401计划会不一致吗 打印到屏幕上的错误消息是 以下是负责进行url调用的方法: def simpleExecuteRequest

我有一个python脚本,它使用urllib2进行一系列url调用。url位于http上,但需要身份验证。我目前正在尝试运行脚本,这样它将发出100多个调用。每次我运行脚本时,有些调用都会失败,错误代码为401,有些则会通过。所有调用都使用相同的用户名和密码针对相同的URL。(每次我运行脚本时,失败的调用并不相同,有时第一次调用失败,有时可以正常工作。)

你知道为什么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
def simpleExecuteRequest(minX,minY,maxX,maxY,type):
url='1〕http://myhost.com/geowebcache/rest/seed/mylayer.xml'
msgTemplate=“”
迈莱尔
%
%
%
%
纽约市
0
10
图像/png
%
1.
"""
message=msgTemplate%(minX,minY,maxX,maxY,type)
headers={'User-Agent':“Python脚本”,'Content-type':'text/xml;charset=“UTF-8”,'Content-length':'%d'%len(消息)}
passwordManager=urllib2.HTTPPasswordMgrWithDefaultRealm()
密码管理器。添加密码(无,url,'username','xxx')
authenticationHandler=urllib2.HTTPBasicAuthHandler(passwordManager)
proxyHandler=urllib2.proxyHandler({})
opener=urlib2.build\u opener(proxyHandler,authenticationHandler)
urllib2.install_opener(opener)
尝试:
request=urllib2.request(url、消息、标题)
response=urllib2.urlopen(请求)
content=response.read()
打印“成功”
除IOError外,e:
打印e
有时,输出将如下所示

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

成功
成功
...
当运行1分钟后,它可能看起来像这样

<urlopen error (10053, 'Software caused connection abort')>
success
success
<urlopen error (10053, 'Software caused connection abort')>
<urlopen error (10053, 'Software caused connection abort')>
...
success
<urlopen error (10053, 'Software caused connection abort')>
success
success
<urlopen error (10053, 'Software caused connection abort')>
成功
成功
成功
在两次运行中,最小/最大x/y和类型的相同输入序列以相同的顺序提供。

代码在我看来是正确的,所以我看不出问题所在

以下是关于如何进行的一些想法:

  • 在将http请求翻译成脚本之前,我通常在命令行中使用
    curl
    计算出http请求

  • 该库比urllib2更易于使用

  • 当您收到响应时,打印出标题,这样您就可以看到发生了什么

  • e使用
    except IOError作为e
    而不是
    except IOError。新方法可保护您免受难以发现的错误

  • 我猜您已经修改了用户名和密码,并在自己的脚本中使用了真实的用户名和密码;-)


在这一点上,我也同意代码不是问题所在。我在脚本中添加了重试和等待逻辑。如果我在失败的尝试之间睡眠5秒,然后重试10次,我可以在单个脚本执行中成功执行所有119个请求。有些人尝试了8次,有些人第一次就成功了。不太好看,但它完成了任务,因为这只是一个一次性脚本。