背景
咱们做爬虫的或多或少都会遇到附件下载,一般情况站点提供的附件链接会直接声明文件的类型,但是有些提供的只是一个api,然后触发下载时再返回附件文本,这个时候我们是没法直接知道文件类型的,而我们使用requests下载并存储附件时是必须要定义好它的文件类型的,那有什么解决方案呢?
解决方案
mimetypes
mimetypes
是python内置库,它能映射文件名到 MIME 类型,使用下面命令可以得到文件的MIME 类型
def get_file_type(file_path):mime_type, _ = mimetypes.guess_type(file_path)if mime_type is None:return Noneelse:return mime_type# 示例使用
file_path = r'测试.pdf'
file_type = get_file_type(file_path)
print(f"The file type is: {file_type}")
运行结果:The file type is: application/pdf
得到结果后,我们可以构建映射表来得到实际的文件结尾名,下面我提供一些映射关系
MIME_MAP = {'audio/aac': 'aac','application/x-abiword': 'abw','image/apng': 'apng','application/x-freearc': 'arc','image/avif': 'avif','video/x-msvideo': 'avi','application/vnd.amazon.ebook': 'azw','application/octet-stream': 'bin','image/bmp': 'bmp','application/x-bzip': 'bz','application/x-bzip2': 'bz2','application/x-cdf': 'cda','application/x-csh': 'csh','text/css': 'css','text/csv': 'csv','application/msword': 'doc','application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx','application/vnd.ms-fontobject': 'eot','application/epub+zip': 'epub','application/gzip': 'gz','image/gif': 'gif','text/html': 'htm,','image/vnd.microsoft.icon': 'ico','text/calendar': 'ics','application/java-archive': 'jar','image/jpeg': 'jpeg,','text/javascript': 'js','application/json': 'json','application/ld+json': 'jsonld','audio/midi、audio/x-midi': 'mid,','audio/mpeg': 'mp3','video/mp4': 'mp4','video/mpeg': 'mpeg','application/vnd.apple.installer+xml': 'mpkg','application/vnd.oasis.opendocument.presentation': 'odp','application/vnd.oasis.opendocument.spreadsheet': 'ods','application/vnd.oasis.opendocument.text': 'odt','audio/ogg': 'oga','video/ogg': 'ogv','application/ogg': 'ogx','audio/opus': 'opus','font/otf': 'otf','image/png': 'png','application/pdf': 'pdf','application/x-httpd-php': 'php','application/vnd.ms-powerpoint': 'ppt','application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pptx','application/vnd.rar': 'rar','application/rtf': 'rtf','application/x-sh': 'sh','image/svg+xml': 'svg','application/x-tar': 'tar','image/tiff': 'tif,','video/mp2t': 'ts','font/ttf': 'ttf','text/plain': 'txt','Visio application/vnd.visio': 'vsd','audio/wav': 'wav','audio/webm': 'weba','video/webm': 'webm','image/webp': 'webp','font/woff': 'woff','font/woff2': 'woff2','application/xhtml+xml': 'xhtml','application/vnd.ms-excel': 'xls','application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx','application/vnd.mozilla.xul+xml': 'xul','application/zip': 'zip','audio/3gpp': '3gp','audio/3gpp2': '3g2','application/x-7z-compressed': '7z','application/x-compressed': 'rar',
}
依赖这个其实可以快速得出文件的类型,但是这个库没法支持二进制识别啊,这很明显不符合我们的需求
python-magic
python-magic
是第三方库,需要单独安装
pip install python-magic
Windows 下需要安装 libmagic 的DLL,否则报错ImportError: failed to find libmagic. Check your installation
pip install python-magic-bin
判断代码
import magic
print(magic.from_file('test.jpg'))
print(magic.from_file('test.jpg', mime=True))
print(magic.from_buffer(open('test.jpg', 'rb').read(), mime=True)) # 二进制读取
响应体Content-Disposition、Content-Type
一般情况下响应体会返回Content-Disposition
和Content-Type
声明文件类型
文件的文件头标识
这篇博客提供了常见的二进制常见文件标识
https://blog.csdn.net/yagerfgcs/article/details/51427085
但是研究发现像docx和zip是一样的标识,有些文件还不固定,大家看着用
结束
暂时研究到这,大家有好的方案可以分享分享