@Adem Öztaş 提供了一个很好的答案,用于与httplib
and一起使用urllib2
。因为requests
,如果问题是严格关于资源存在的,那么在资源存在大的情况下可以改进答案。
先前的答案requests
建议如下:
def uri_exists_get(uri: str) -> bool:
try:
response = requests.get(uri)
try:
response.raise_for_status()
return True
except requests.exceptions.HTTPError:
return False
except requests.exceptions.ConnectionError:
return False
requests.get
尝试一次提取整个资源,因此对于大型媒体文件,上面的代码片段将尝试将整个媒体拉入内存。为了解决这个问题,我们可以流式传输响应。
def uri_exists_stream(uri: str) -> bool:
try:
with requests.get(uri, stream=True) as response:
try:
response.raise_for_status()
return True
except requests.exceptions.HTTPError:
return False
except requests.exceptions.ConnectionError:
return False
我运行了上面的代码片段,并针对两个 Web 资源附加了计时器:
1) http://bbb3d.renderfarming.net/download.html,一个非常轻量级的html页面
2) http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4,一个大小适中的视频文件
计时结果如下:
uri_exists_get("http://bbb3d.renderfarming.net/download.html")
# Completed in: 0:00:00.611239
uri_exists_stream("http://bbb3d.renderfarming.net/download.html")
# Completed in: 0:00:00.000007
uri_exists_get("http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4")
# Completed in: 0:01:12.813224
uri_exists_stream("http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4")
# Completed in: 0:00:00.000007
最后一点:此功能也适用于资源主机不存在的情况。例如"http://abcdefghblahblah.com/test.mp4"
将返回False
.