很抱歉标题不是很清楚,基本上我有一个包含一系列网址的列表,打算下载那些图片。无论如何要检查网页是否是图像,以便我可以跳过那些不是的图像?
提前致谢
答案 0 :(得分:4)
没有可靠的方法。但是你可以找到一个在你的情况下可能“足够好”的解决方案。
您可以查看文件扩展名是否存在于网址中,例如,.png
,.jpg
可能表示图片:
>>> import os
>>> name = url2filename('http://example.com/a.png?q=1')
>>> os.path.splitext(name)[1]
'.png'
>>> import mimetypes
>>> mimetypes.guess_type(name)[0]
'image/png'
其中url2filename()
function is defined here。
您可以检查Content-Type
http标头:
>>> import urllib.request
>>> r = urllib.request.urlopen(url) # make HTTP GET request, read headers
>>> r.headers.get_content_type()
'image/png'
>>> r.headers.get_content_maintype()
'image'
>>> r.headers.get_content_subtype()
'png'
您可以检查http正文的最开头是否有指示图像文件的幻数,例如jpeg may start with b'\xff\xd8\xff\xe0'
或:
>>> prefix = r.read(8)
>>> prefix # .png image
b'\x89PNG\r\n\x1a\n'
As @pafcu suggested in the answer to the related question,您可以使用imghdr.what()
function:
>>> import imghdr
>>> imghdr.what(None, b'\x89PNG\r\n\x1a\n')
'png'
答案 1 :(得分:4)
您可以使用requests模块。提出头请求并检查内容类型。头部请求不会下载响应正文。
import requests
response = requests.head(url)
print response.headers.get('content-type')
答案 2 :(得分:1)
您可以使用mimetypes
https://docs.python.org/3.0/library/mimetypes.html
import urllib
from mimetypes import guess_extension
url="http://example.com/image.png"
source = urllib.urlopen(url)
extension = guess_extension(source.info()['Content-Type'])
print extension
这将返回“png”