[英]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.