当前位置: 首页 > news >正文

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

背景

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

文件的文件头标识

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

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

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

结束

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

相关文章:

  • UML交互图-协作图
  • Kotlin 协程:从基础概念到开发实践
  • 可以自定义的文字识别OCR
  • 微软 Edge 推出 WebUI 2.0:从 React 到 Web Components + HTML,速度提升了42%
  • ATA-2088高压放大器在细胞分选中的作用是什么
  • Joplin Typora 粘贴图片 | 当使用Typora作为Joplin编辑器时,如何粘贴图片并上传到Joplin服务器,替换链接
  • Java类加载大冒险,谁能将它变成漫画
  • 【网络安全的神秘世界】Kali 自带 Burp Suite 使用指南:字体与CA证书设置详解等
  • LeetCode题练习与总结:二叉树中的最大路径和--124
  • pytorch中,load_state_dict和torch.load的区别?
  • JSONObject.toJSONString(***) json化后的值中的日期值被转换为时间戳?如何修改?
  • 源码文章上传无忧,论坛小程序支持
  • 人工智能GPT-4o?
  • 【AI基础】第三步:纯天然保姆喂饭级-安装并运行chatglm2-6b
  • 大型零售企业总部到分公司数据发放,有没有更优化的方案?
  • ES6指北【2】—— 箭头函数
  • python3.6+scrapy+mysql 爬虫实战
  • 【刷算法】求1+2+3+...+n
  • canvas绘制圆角头像
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript设计模式系列一:工厂模式
  • java取消线程实例
  • Just for fun——迅速写完快速排序
  • mysql 5.6 原生Online DDL解析
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • VUE es6技巧写法(持续更新中~~~)
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Vue学习第二天
  • 大快搜索数据爬虫技术实例安装教学篇
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 关于extract.autodesk.io的一些说明
  • 精彩代码 vue.js
  • 开源地图数据可视化库——mapnik
  • 两列自适应布局方案整理
  • 区块链将重新定义世界
  • 我与Jetbrains的这些年
  • 中文输入法与React文本输入框的问题与解决方案
  • - 转 Ext2.0 form使用实例
  • 《码出高效》学习笔记与书中错误记录
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • #if 1...#endif
  • #pragma once与条件编译
  • #vue3 实现前端下载excel文件模板功能
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (day 12)JavaScript学习笔记(数组3)
  • (Qt) 默认QtWidget应用包含什么?
  • (SERIES10)DM逻辑备份还原
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (第30天)二叉树阶段总结
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (七)理解angular中的module和injector,即依赖注入
  • (三)elasticsearch 源码之启动流程分析
  • (算法)Travel Information Center
  • (一)WLAN定义和基本架构转
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记