python:检查是否存在url到jpg

python: check if url to jpg exists

在Python中,如何检查以.jpg结尾的URL是否存在?

前任:http://www.fakedomain.com/fakeimage.jpg

谢谢


1
2
3
4
5
6
7
8
9
10
11
>>> 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)


下面的代码相当于Tikiboy的答案,但是使用了一个高级且易于使用的请求库。

1
2
3
4
5
6
7
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可能会抛出异常,因此您可能希望添加一个try-except构造。

另外,如果要包括代码301302,也要考虑代码303,特别是当您取消引用表示链接数据中资源的uri时。一个URI可能代表一个人,但是你不能下载一个人,所以服务器会将你重定向到一个使用303重定向来描述这个人的页面。


感谢所有人的回答,最终使用了以下内容:

1
2
3
4
5
try:
  f = urllib2.urlopen(urllib2.Request(url))
  deadLinkFound = False
except:
  deadLinkFound = True


当文件位于ftp服务器(ftp://url.com/file)中时,前面的答案有问题,当文件位于ftp、http或https中时,以下代码起作用:

1
2
3
4
5
6
7
8
9
10
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


看起来http://www.fakedomain.com/fakeImage.jpg自动重定向到http://www.fakedomain.com/index.html没有任何错误。

301和302响应的重定向将自动完成,而不会向用户返回任何响应。

请看一看httpredirecthandler,您可能需要子类化它来处理它。

以下是"潜入Python"中的一个示例:

http://diveintopython3.ep.io/http web services.html重定向


尝试机械化:

1
2
3
4
5
6
7
8
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'


在python 3.6.5中:

1
2
3
4
5
6
7
8
9
10
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")

在python 3中,模块httplib已重命名为http.client

您需要从URL中删除http://https://,因为httplib:视为端口号,端口号必须为数字。


这可能足够好,可以查看文件的URL是否存在。

1
2
3
import urllib
if urllib.urlopen('http://www.fakedomain.com/fakeImage.jpg').code == 200:
  print 'File exists'


我认为您可以尝试向URL发送一个HTTP请求并读取响应。如果没有捕获到异常,则可能存在异常。