如何在程序上区分普通网址和图片网址

时间:2015-05-24 16:18:27

标签: python http url web

如何区分普通网址和图片网址(仅包含图片的网址)。

普通网址:http://www.wikipedia.org/ 图片网址:https://encrypted-tbn1.gstatic.com/images?q=tbn%3AANd9GcTwC6cNpAen5dgGgTmmH2SG75xhvTN-oRliaOgG-3meNQVm-GdpUu7SQX5wpA

4 个答案:

答案 0 :(得分:4)

您可以发出head请求来检查url的内容类型。 HEAD请求不会下载正文内容。 使用python requests模块的示例:

>>> import requests
>>> url = "https://encrypted-tbn1.gstatic.com/images?q=tbn%3AANd9GcTwC6cNpAen5dgGgTmmH2SG75xhvTN-oRliaOgG-3meNQVm-GdpUu7SQX5wpA"
>>> h = requests.head(url)
>>> print h.headers.get('content-type')
image/jpeg

答案 1 :(得分:2)

几乎所有HTTP服务器都会在对GETHEAD网址请求的回复中返回Content-Type标头:

enter image description here

处理大量网址最快的方法是只检索标题而不下载整个文件,并检查内容类型响应标头上的mime类型(这是{{3}的列表你必须检查。它们都以image /开头,这就是你要找的东西。

例如,使用pycurl(你可以使用pip或image mime types获取它,如果你在Windows上; here用于64位窗口),这样的东西将检查响应头(I&#39 ;我不熟悉python所以我建议你搜索如何解析Content-Type标题,以便更好地检查图像mime类型,并在函数上正确封装它:)

#!/usr/bin/python
import pycurl
from StringIO import StringIO
import re

def check_image(url):

    headers = StringIO()

    c = pycurl.Curl()
    c.setopt(c.URL, url)
    c.setopt(c.HEADER, 1)
    c.setopt(pycurl.SSL_VERIFYPEER, 0)
    c.setopt(pycurl.SSL_VERIFYHOST, 0) # do not verify ssl certificate
    c.setopt(c.NOBODY, 1) # header only, no body
    c.setopt(c.HEADERFUNCTION, headers.write)
    c.setopt(pycurl.WRITEFUNCTION, lambda x: None)
    c.perform()
    c.close()
    a = re.compile("^.*?Content-Type:( )*image/.*?$", re.IGNORECASE | re.MULTILINE | re.DOTALL)
    if a.match(headers.getvalue()) is None:
        return False
    else:
        return True

if check_image('http://www.wikipedia.org/') is False:
    print 'The resource in http://www.wikipedia.org/ is not an image'

if check_image('https://encrypted-tbn1.gstatic.com/images?q=tbn%3AANd9GcTwC6cNpAen5dgGgTmmH2SG75xhvTN-oRliaOgG-3meNQVm-GdpUu7SQX5wpA') is True:
    print 'The resource in https://encrypted-tbn1.gstatic.com/images?q=tbn%3AANd9GcTwC6cNpAen5dgGgTmmH2SG75xhvTN-oRliaOgG-3meNQVm-GdpUu7SQX5wpA is an image'

答案 2 :(得分:1)

如果您想在下载之前获取内容类型为URL,那就是HTTP命令HEAD的用途。如果您执行HEAD而不是GET,您将获得GET将返回的相同标头,但没有正文(意味着您和服务器的开销更少)

其中一个标题应为Content-Type,这将告诉您它是否是图片。

如果你想更进一步,你可以从处置标题中猜出文件名,如果没有,那么,最终重定向网址的基本名称的扩展名,这是浏览器通常用来向你展示图像的方式服务器坏了,但很少需要。

如果您出于某种原因无法提出任何网络请求,那么您可以做的最好是启发式猜测。如果你只是从一个特定的服务器上抓取,比如维基百科,你可以获得一个URL列表,并尝试找到服务器使用的模式 - 例如,URL的某个部分中的images - - 它可能适用于许多图像,但可能不适用于所有图像,并且可能在下次进行主要服务升级时中断,因此您必须继续观看并定期改进您的启发式代码。

答案 3 :(得分:0)

仅通过查看网址无法确定网址内容。

您最好的选择是获取页面并检查检索到的内容。