Python 如何通过编程区分普通url和图像url
如何区分普通url和图像url(只有图像的url) 普通url:Python 如何通过编程区分普通url和图像url,python,http,url,web,Python,Http,Url,Web,如何区分普通url和图像url(只有图像的url) 普通url: 图像url:仅通过查看url无法确定url的内容 您最好的选择是获取页面并检查检索到的内容。几乎总是HTTP服务器在响应GET或HEADurl请求时返回内容类型头: 处理大量URL的最快方法是只检索头,而不下载整个文件,并在content type响应头上检查其mime类型(以下是您必须检查的列表。它们都以image/开头,这就是您要查找的内容) 例如,使用pycurl(您可以使用pip或如果您在windows上;对于64位wi
图像url:仅通过查看url无法确定url的内容
您最好的选择是获取页面并检查检索到的内容。几乎总是HTTP服务器在响应
GET
或HEAD
url请求时返回内容类型头:
处理大量URL的最快方法是只检索头,而不下载整个文件,并在content type响应头上检查其mime类型(以下是您必须检查的列表。它们都以image/开头,这就是您要查找的内容)
例如,使用pycurl(您可以使用pip或如果您在windows上;对于64位windows),类似的内容将检查响应头(我对python不太熟悉,因此建议您搜索如何解析内容类型头,以找到更好的方法来检查图像mime类型,并在函数上正确封装它):
如果您想在下载前获取as URL的内容类型,这就是HTTP命令
HEAD
的作用。如果您使用HEAD
而不是GET
,您将获得与GET
返回的头相同的头,但没有正文(这意味着您和服务器的开销会减少)
其中一个标题应该是内容类型
,这将告诉您它是否是图像
如果您想更进一步,您可以从disposition标头猜测文件名,如果猜不到,则猜测最终重定向URL的basename的扩展名,这是浏览器通常在服务器损坏的情况下向您显示图像的操作,但这很少需要
如果由于某种原因,您根本无法发出任何网络请求,那么您所能做的最好的事情就是试探性地猜测。如果您只是从一个特定的服务器(如Wikipedia)上抓取,您可以获得一个URL列表,并尝试查找服务器使用的模式—例如,URL的某个部分中的
图像
,这可能适用于许多图像,但可能不适用于所有图像,并且在下次进行重大服务升级时可能会中断,因此,您必须继续关注并定期改进启发式代码。您可以发出head
请求,检查url
的内容类型。HEAD请求不会下载正文内容。
使用python模块的示例:
按照url阅读内容类型。如果服务器很好,最好使用HEAD而不是GET。这个请求库非常酷。开始从php迁移到python的另一个原因;-)
#!/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'
>>> 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