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

时间:2011-11-01 15:07:14

标签: python urllib2

我有一个python脚本,使用urllib2进行一系列url调用。网址是http,但需要身份验证。我目前正在尝试运行脚本,以便它将进行100多次调用。每次我运行脚本时,一些调用失败,错误代码为401,有些调用通过。所有呼叫都使用相同的用户名和密码进行相同的URL。 (每次运行脚本时,调用失败的调用都不一样,有时第一次调用失败,有时会失败。)

为什么401可能会出现不一致的任何想法?

打印在屏幕上的错误信息是......

以下是负责进行网址调用的方法:

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')>

在两次运行中,min / max x / y和type的相同系列输入以相同的顺序提供。     ...

1 个答案:

答案 0 :(得分:0)

代码对我来说是正确的,所以我没有看到问题。

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

  • 我通常在使用curl之前在命令行处理http请求,然后再将其转换为脚本。

  • {urlerib2

  • <{3}}库更容易使用
  • 当您收到回复时,请打印标题以便查看正在进行的操作

  • 而不是except IOError, e使用except IOError as e。新方法可以保护您免于发现错误。

  • 我认为您编辑了用户名和密码,并在您自己的脚本中使用了真实的用户名和密码; - )