import requests
def exists(path):
r = requests.head(path)
return r.status_code == requests.codes.ok
print exists('http://www.fakedomain.com/fakeImage.jpg')
requests.codes.ok
等于 200
,所以如果你愿意,可以替换为确切的状态码。requests.head
可能会抛出 exception 异常,因此您可能需要添加 try-except 结构。301
和 302
,考虑到使用 Linked Data 中表示资源的 URI,尤其是如果您要 dereference URIs。URI 可能代表一个人,但您无法下载一个人,因此服务器将重定向您到一个页面,该页面使用 303 redirect 描述此人。>>> import httplib
>>>
>>> def exists(site, path):
... conn = httplib.HTTPConnection(site)
... conn.request('HEAD', path)
... response = conn.getresponse()
... conn.close()
... return response.status == 200
...
>>> exists('http://www.fakedomain.com', '/fakeImage.jpg')
False
如果状态码不是200,那么该URL上的资源不存在。这并不意味着该资源已经完全消失。如果服务器返回301或302,则表示该资源仍然存在,但位于不同的URL上。要更改函数以处理此情况,只需将状态检查行更改为return response.status in (200, 301, 302)
。conn.request
时使用HEAD
而不是GET
可能更有效率,因为你只是检查它是否存在。 - Daniel Rosemangaierror: [Errno 8] nodename nor servname provided, or not known
,请确保您的'site'值不包括 http://
、ftp://
等内容。相反,看起来 httplib 会尝试推导出正确的协议或需要指定适当的端口号(参见下面的附加注释)。 - bluebinaryhttp://www.fakedomain.com
更改为 www.fakedomain.com:80
,从而解决了此问题。事实上,在查看python.org上httplib文档时,我注意到列出的示例排除了URL中的协议定义:http://docs.python.org/2/library/httplib.html - bluebinarytry:
f = urllib2.urlopen(urllib2.Request(url))
deadLinkFound = False
except:
deadLinkFound = True
http://www.fakedomain.com/fakeImage.jpg
自动重定向到 http://www.fakedomain.com/index.html
,没有任何错误返回给用户。import urllib2
def file_exists(url):
request = urllib2.Request(url)
request.get_method = lambda : 'HEAD'
try:
response = urllib2.urlopen(request)
return True
except:
return False
使用mechanize试试:
import mechanize
br = mechanize.Browser()
br.set_handle_redirect(False)
try:
br.open_novisit('http://www.fakedomain.com/fakeImage.jpg')
print 'OK'
except:
print 'KO'
import urllib
if urllib.urlopen('http://www.fakedomain.com/fakeImage.jpg').code == 200:
print 'File exists'
import http.client
def exists(site, path):
connection = http.client.HTTPConnection(site)
connection.request('HEAD', path)
response = connection.getresponse()
connection.close()
return response.status == 200
exists("www.fakedomain.com", "/fakeImage.jpg")
httplib
已被重命名为http.client
。http://
和https://
,因为httplib
将:
视为端口号,而端口号必须是数字。@z3moon的回答很好,但我认为它是针对py 2.x的。对于python 3.x,您可能需要在模块调用中添加request
。
import urllib
def check_valid_URLs(url) -> bool:
try:
if urllib.request.urlopen(url).code == 200:
return True
else:
return False
except:
return False
Python3
import requests
def url_exists(url):
"""Check if resource exist?"""
if not url:
raise ValueError("url is required")
try:
resp = requests.head(url)
return True if resp.status_code == 200 else False
except Exception as e:
return False