繁体   English   中英

页面响应时间过长时,urllib请求失败

[英]urllib request fails when page takes too long to respond

我有一个简单的函数(在python 3中)获取一个URL并尝试解决它:如果有一个错误代码(例如404),则打印错误代码,或将缩短的URL之一解析为其完整URL。 我的网址在csv文件的一列中,输出保存在下一列中。 问题出现在程序遇到URL的地方,服务器花费了很长时间来响应-程序崩溃了。 如果服务器花费的时间太长,是否有一种简单的方法可以强制urllib打印错误代码。 在函数调用中研究了Timeout,但是由于我刚开始,它看起来有点太复杂了。 有什么建议么?

即(COL A)shorturl(COL B) http://deals.ebay.com/500276625

def urlparse(urlColumnElem):
    try:
        conn = urllib.request.urlopen(urlColumnElem)
    except urllib.error.HTTPError as e:
        return (e.code)
    except urllib.error.URLError as e:
        return ('URL_Error')
    else:
        redirect=conn.geturl()
        #check redirect
        if(redirect == urlColumnElem):
            #print ("same: ")
            #print(redirect)
            return (redirect)
        else:
            #print("Not the same url ")
            return(redirect)

编辑:如果有人遇到http.client.disconnected错误(例如我),请在阅读/解析URL列表时查看此问题/答案http.client.RemoteDisconnected错误。

看一下文档

 urllib.request.urlopen(url, data=None[, timeout]) 

可选的timeout参数以秒为单位指定用于阻止诸如连接尝试之类的操作的超时(如果未指定,将使用全局默认超时设置)。

您可以为过程设置实际的timeout (以秒为单位):

conn = urllib.request.urlopen(urlColumnElem, timeout=realistic_timeout_in_seconds)

为了使您的代码停止崩溃,请将所有内容移至try except块内:

import socket

def urlparse(urlColumnElem):
    try:
        conn = urllib.request.urlopen(
                   urlColumnElem, 
                   timeout=realistic_timeout_in_seconds
               )
        redirect=conn.geturl()
        #check redirect
        if(redirect == urlColumnElem):
            #print ("same: ")
            #print(redirect)
            return (redirect)
        else:
            #print("Not the same url ")
            return(redirect)

    except urllib.error.HTTPError as e:
        return (e.code)
    except urllib.error.URLError as e:
        return ('URL_Error')
    except socket.timeout as e:
        return ('Connection timeout')

现在,如果发生超时,您将捕获异常并且程序不会崩溃。

祝好运 :)

首先,有一个超时参数,该参数可用于控制urlopen允许的时间。 接下来, urlopen的超时应该只引发一个异常,更确切地说是socket.timeout 如果您不希望它中止程序,则只需捕获它即可:

def urlparse(urlColumnElem, timeout=5):   # allow 5 seconds by default
    try:
        conn = urllib.request.urlopen(urlColumnElem, timeout = timeout)
    except urllib.error.HTTPError as e:
        return (e.code)
    except urllib.error.URLError as e:
        return ('URL_Error')
    except socket.timeout:
        return ('Timeout')
    else:
        ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM