如何区分普通网址和图片网址(仅包含图片的网址)。
普通网址:http://www.wikipedia.org/ 图片网址:https://encrypted-tbn1.gstatic.com/images?q=tbn%3AANd9GcTwC6cNpAen5dgGgTmmH2SG75xhvTN-oRliaOgG-3meNQVm-GdpUu7SQX5wpA
答案 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服务器都会在对GET
或HEAD
网址请求的回复中返回Content-Type标头:
处理大量网址最快的方法是只检索标题而不下载整个文件,并检查内容类型响应标头上的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)
仅通过查看网址无法确定网址内容。
您最好的选择是获取页面并检查检索到的内容。