从python urllib2.urlopen调用不一致地接收401个错误
我有一个python脚本,它使用urllib2进行一系列url调用。url位于http上,但需要身份验证。我目前正在尝试运行脚本,这样它将发出100多个调用。每次我运行脚本时,有些调用都会失败,错误代码为401,有些则会通过。所有调用都使用相同的用户名和密码针对相同的URL。(每次我运行脚本时,失败的调用并不相同,有时第一次调用失败,有时可以正常工作。) 你知道为什么401计划会不一致吗 打印到屏幕上的错误消息是 以下是负责进行url调用的方法:从python urllib2.urlopen调用不一致地接收401个错误,python,urllib2,Python,Urllib2,我有一个python脚本,它使用urllib2进行一系列url调用。url位于http上,但需要身份验证。我目前正在尝试运行脚本,这样它将发出100多个调用。每次我运行脚本时,有些调用都会失败,错误代码为401,有些则会通过。所有调用都使用相同的用户名和密码针对相同的URL。(每次我运行脚本时,失败的调用并不相同,有时第一次调用失败,有时可以正常工作。) 你知道为什么401计划会不一致吗 打印到屏幕上的错误消息是 以下是负责进行url调用的方法: def simpleExecuteRequest
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请求翻译成脚本之前,我通常在命令行中使用
计算出http请求curl
- 该库比urllib2更易于使用
- 当您收到响应时,打印出标题,这样您就可以看到发生了什么
- e使用
而不是except IOError作为e
except IOError。新方法可保护您免受难以发现的错误
- 我猜您已经修改了用户名和密码,并在自己的脚本中使用了真实的用户名和密码;-)