附件采集文件类型识别方案

背景

咱们做爬虫的或多或少都会遇到附件下载,一般情况站点提供的附件链接会直接声明文件的类型,但是有些提供的只是一个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-DispositionContent-Type声明文件类型
在这里插入图片描述

文件的文件头标识

这篇博客提供了常见的二进制常见文件标识

https://blog.csdn.net/yagerfgcs/article/details/51427085

但是研究发现像docx和zip是一样的标识,有些文件还不固定,大家看着用

结束

暂时研究到这,大家有好的方案可以分享分享

posted @ 2024-06-12 12:04  七夜魔手  阅读(3)  评论(0编辑  收藏  举报  来源