附件采集文件类型识别方案
背景
咱们做爬虫的或多或少都会遇到附件下载,一般情况站点提供的附件链接会直接声明文件的类型,但是有些提供的只是一个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 None
else:
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是一样的标识,有些文件还不固定,大家看着用
结束
暂时研究到这,大家有好的方案可以分享分享
本文来自博客园,作者:七夜魔手,转载请注明原文链接:https://www.cnblogs.com/ranbox/p/18461037