【问题标题】:Why do I get two different status code from conn.getresponse().status in python?为什么我从 python 中的 conn.getresponse().status 得到两个不同的状态码?
【发布时间】:2015-07-24 16:26:36
【问题描述】:

所以我想检查一个 URL 是否可以从 python 访问,我从谷歌搜索得到这个代码:

def checkUrl(url):
    p = urlparse(url)
    conn = http.client.HTTPConnection(p.netloc)
    conn.request('HEAD', p.path)
    resp = conn.getresponse()
    return  resp.status < 400

这是我的网址:https://eurotableau.nomisonline.com。 如果我只是将它传递给函数,它就可以正常工作。 resp.status 是 302。但是,如果我在其末尾添加一个端口 443,https://eurotableau.nomisonline.com:443,它将返回 false。 resp.status 是 400。我在谷歌浏览器中尝试了两个 URL,它们都可以工作。所以我的问题是为什么会这样?无论如何,我可以包含端口值并仍然获得有效的 resp.status 值(

【问题讨论】:

    标签: python http url https


    【解决方案1】:

    请改用http.client.HTTPSConnection。普通的旧 HTTPConnection 忽略了作为 URL 一部分的协议。

    【讨论】:

    • 还有一个问题,如果URL是http而不是https,HTTPSConnection还能用吗?谢谢。
    • 您可以执行Connection = HTTPSConnection if 'https' in p.netloc else HTTPConnection 之类的操作,然后使用conn = Connection(p.netloc) 之前的类。我目前没有可用的 Python3 来检查 HTTPSConnection 是否适用于非 SSL URL。
    【解决方案2】:

    如果您不需要 HEAD 方法,但只想检查主机是否可用,那么为什么不这样做:

    from urllib2 import urlopen
    
    try:
        u = urlopen("https://eurotableau.nomisonline.com")
        u.close()
        print "Everything fine!"
    except Exception, e:
        if hasattr(e, "code"):
            print "Server is there but something is wrong with rest of URL"
        else: print "Server is on vacations or was never there!"
        print e
    

    这将与服务器建立连接,但除非您阅读它,否则它不会下载任何数据。它只会读取几 KB 来获取标头(例如使用 HEAD 方法时)并等待您请求更多。但你会在那里关闭它。

    因此,您可以捕获异常并查看问题所在,或者如果没有异常,则关闭连接。

    urllib2 会为你巧妙地处理 HTTPS 和 protocol://user@URL:PORT。 什么都不用担心。

    【讨论】:

    • 这是一个很好的答案!但我想知道为什么运行这段代码需要 3 秒钟的时间?我在 macbook pro osx yosemite 上使用 python3.3
    • 添加超时应该会有所帮助: u = urlopen("something.blah", timeout=0.5);我想知道为什么直接使用 httplib 不会给你同样的延迟。这正是操作系统需要检查从本地到远程 DNS 的所有 DNS 条目的时候。如果域存在,则它是真正的 TCP/IP 超时(套接字等待 TCP/IP 握手)并且可以控制。但这意味着如果用户的连接速度非常慢(56K 调制解调器:D),您可能会错误地认为服务器不可用只是因为超时过期。
    • 没问题。我稍微编辑了答案以涵盖所有内容。而且,嗯,也许你应该修改你的问题标题。它与您的 Q 不匹配,甚至与我的 A 不匹配。:D :D
    猜你喜欢
    • 2021-03-07
    • 2021-01-08
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多