我的编程空间,编程开发者的网络收藏夹
学习永远不晚

用Python的requests库实现自动上传文件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

用Python的requests库实现自动上传文件

女朋友下班后听她吐槽自己领导安排了一件又要让她加班的工作。大致任务是:在公司网址上为近10万客户上传签订的合同的基础信息并上传对应的资料附件。月底前必须完成,人工一天才传了1000左右,按这个节奏根本完不成。
为了不让她加班,这边写了一个小脚本来实现自动上传。
思路:抓取对应上传资料接口,分析出接口入参,通过读取Excel里的数据,用Python的requests库来调用接口传入实现。

准备工作

  1. 需安装Python的requests、xlrd库
pip install requestspip install xlrd==1.2.0 # xlrd2.0.1版本以后不支持.xlsx格式
  1. 附件和客户资料汇总文档(已有,只需按接口上传格式整理下即可)

一、整理接口文档(F12或fiddler工具)

使用F12开发者工具或者fiddler工具(fiddler使用教程)抓取接口的URL、请求头、入参、出参
在这里插入图片描述

通过入参格式可以看出
在这里插入图片描述

根据抓取的接口信息把需上传的信息整理成对应文档格式
在这里插入图片描述

二、编写脚本

1. 通过xlrd读取Excel

读取Excel数据,以标题作为字典的key,按每行数据拼接出入参数据,
返回格式[{“a”:“a值”,…},{“a”:“a值”,…},…]方便后续传参读取。

    def get_data(self, file):        """        读取Excel数据,以标题作为字典的key,按每行数据拼接出入参数据,        返回格式[{"a":"a值",....},{"a":"a值",....},....]        :param file: 文档        :return: [{"a":"a值",....},{"a":"a值",....},....]        """        e = xlrd.open_workbook(file)        sheet = e.sheet_by_index(0)        lists = []        key = sheet.row_values(0)        for i in range(1, sheet.nrows):            value = sheet.row_values(i)            dic = {}            for j in range(sheet.ncols):                dic[key[j]] = value[j]            lists.append(dic)        return lists

2.读取Excel数据的附件名,判断对应路径是否存在对应附件。

判断是否对应附件存在,存在就返回:实际附件路径和附件名,否则返回:null

    def get_file(self, files, path):        """         通过附件名查看是否附件存在        :param files: 附件名        :param path: 附件存放路径        :return: 附件路径dirpath, 附件名flie_name        """        dirpath, flie_name = '', ''        for dirpath, dirs, filenames in os.walk(path):            for v in range(len(filenames)):                if filenames[v].find(files) != -1:                    flie_name = filenames[v]                    break                else:                    flie_name = 'null'        return dirpath, flie_name

3.编写调用上传接口

循环获取Excel文档里的参数,作为请求入参的data,读取附件内容并上传。
注意点:
①附件格式传入对应类型是不同的:jpg、jpeg、pdf、doc、docx、zip、rar
②如果接口需要cookie的获取、cookie有效期

if ext == '.jpg':    file_type = 'image/jpeg'elif ext == '.jpeg':    file_type = 'image/jpeg'elif ext == '.pdf':    file_type = 'application/pdf'elif ext == '.doc':    file_type = 'application/msword'elif ext == '.docx':    file_type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'elif ext == '.zip':    file_type = 'application/x-zip-compressed'elif ext == '.rar':    file_type = 'application/octet-stream'

循环执行上传,最后判断下接口结果,并记录日志

    def execute_api(self, url, file, path, cookie):        """        通过requests调用API上传附件和对应信息        :param url: 接口地址        :param file: 汇总文件名        :param path: 资料附件存放路径        :param cookie: 有效的cookie        :return:        """        lists = self.get_data(file)        for datas in lists:            custCode = datas['custCode']            files = datas['files']            del datas['files']            datas.update()            datas['classId'] = '19'            datas['sendSms'] = 'false'            datas['profileSource'] = '1'            dirpath, file_name = self.get_file(files, path)            results = ''            if file_name != 'null':                ext = os.path.splitext(file_name)[1]                if ext == '.jpg':                    file_type = 'image/jpeg'                elif ext == '.jpeg':                    file_type = 'image/jpeg'                elif ext == '.pdf':                    file_type = 'application/pdf'                elif ext == '.doc':                    file_type = 'application/msword'                elif ext == '.docx':                    file_type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'                elif ext == '.zip':                    file_type = 'application/x-zip-compressed'                elif ext == '.rar':                    file_type = 'application/octet-stream'                else:                    file_type = ''                file_path = dirpath + file_name                headers = {                    'Cookie': cookie}                result = self.s.post(url=url, data=datas, files={                    "files": (file_name, open(file_path, "rb"), file_type)},         headers=headers)                results = result.text            else:                results = "文件不存在"                with open('err_log.txt', 'a', encoding='utf-8') as f:                    f.write(f'{custCode}' + ',' + results + '\n')            ex = '"success":true'            if ex in results:                r = f'{custCode}:上传成功'            else:                r = f'{custCode}:上传失败'            print(r + ',' + results)            with open('log.txt', 'a', encoding='utf-8') as f:                f.write(r + '\n')

全部源码代码

# -*- coding: utf-8 -*-import osimport requestsimport xlrdclass Test:    def __init__(self):        self.s = requests.session()    def get_data(self, file):        """        读取Excel数据,以标题作为字典的key,按每行数据拼接出入参数据,        返回格式[{"a":"a值",....},{"a":"a值",....},....]        :param file: 文档        :return: [{"a":"a值",....},{"a":"a值",....},....]        """        e = xlrd.open_workbook(file)        sheet = e.sheet_by_index(0)        lists = []        key = sheet.row_values(0)        for i in range(1, sheet.nrows):            value = sheet.row_values(i)            dic = {}            for j in range(sheet.ncols):                dic[key[j]] = value[j]            lists.append(dic)        return lists    def get_file(self, files, path):        """         通过附件名查看是否附件存在        :param files: 附件名        :param path: 附件存放路径        :return: 附件路径dirpath, 附件名flie_name        """        dirpath, flie_name = '', ''        for dirpath, dirs, filenames in os.walk(path):            for v in range(len(filenames)):                if filenames[v].find(files) != -1:                    flie_name = filenames[v]                    break                else:                    flie_name = 'null'        return dirpath, flie_name    def execute_api(self, url, file, path, cookie):        """        通过requests调用API上传附件和对应信息        :param url: 接口地址        :param file: 汇总文件名        :param path: 资料附件存放路径        :param cookie: 有效的cookie        :return:        """        lists = self.get_data(file)        for datas in lists:            custCode = datas['custCode']            files = datas['files']            del datas['files']            datas.update()            datas['classId'] = '19'            datas['sendSms'] = 'false'            datas['profileSource'] = '1'            dirpath, file_name = self.get_file(files, path)            results = ''            if file_name != 'null':                ext = os.path.splitext(file_name)[1]                if ext == '.jpg':                    file_type = 'image/jpeg'                elif ext == '.jpeg':                    file_type = 'image/jpeg'                elif ext == '.pdf':                    file_type = 'application/pdf'                elif ext == '.doc':                    file_type = 'application/msword'                elif ext == '.docx':                    file_type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'                elif ext == '.zip':                    file_type = 'application/x-zip-compressed'                elif ext == '.rar':                    file_type = 'application/octet-stream'                else:                    file_type = ''                file_path = dirpath + file_name                headers = {                    'Cookie': cookie}                result = self.s.post(url=url, data=datas, files={                    "files": (file_name, open(file_path, "rb"), file_type)},         headers=headers)                results = result.text            else:                results = "文件不存在"                with open('err_log.txt', 'a', encoding='utf-8') as f:                    f.write(f'{custCode}' + ',' + results + '\n')            ex = '"success":true'            if ex in results:                r = f'{custCode}:上传成功'            else:                r = f'{custCode}:上传失败'            # print(r + ',' + results)            with open('log.txt', 'a', encoding='utf-8') as f:                f.write(r + '\n')    def write_log(self, r):        """        记录接口调用日志        :param r:        :return:        """        with open('log.txt', 'a', encoding='utf-8') as f:            f.write(r + '\n')if __name__ == '__main__':    t = Test()    # 上传文件接口地址    url = ''    # 合同提供资料汇总文件名    file = '提供资料模板.xlsx'    # 有效的cookie    cookie = ''    # 资料附件存放路径    path = r"D:\Projects\test\files\\"    t.execute_api(url, file, path, cookie)

最后,替换真实的URL、填充模板内容、cookie、附件存放路径,执行脚本,等待执行结束就行啦。

来源地址:https://blog.csdn.net/weixin_46157924/article/details/131347179

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

用Python的requests库实现自动上传文件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python实现自动上传文件到百度网盘

这篇文章主要为大家详细介绍了如何利用Python实现自动上传文件到百度网盘功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
2023-05-17

怎么用python requests实现上传excel数据流

本篇内容主要讲解“怎么用python requests实现上传excel数据流”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用python requests实现上传excel数据流”吧!re
2023-06-29

Python+django实现文件上传

1、文件上传(input标签)(1)html代码(form表单用post方法提交)2022-06-04

Python接口自动化之文件上传/下载接口怎么实现

今天小编给大家分享一下Python接口自动化之文件上传/下载接口怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。〇、前
2023-06-29

Python+django实现简单的文件上传

今天分享一下Django实现的简单的文件上传的小例子。 步骤创建Django项目,创建Django应用设计模型处理urls.py 以及views.py设计模板,设计表单运行项目,查看数据库 下面我们就一起来分别完成每一个小部分吧。 创建项目
2022-06-04

Python怎么实现上传Minio文件

本篇内容介绍了“Python怎么实现上传Minio文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!环境依赖安装minio以及oss2依赖p
2023-06-25

python+django快速实现文件上传

对于web开来说,用户登陆、注册、文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说就没办法一步一步的操作练习;对于web应用来说,包括数据库的创建,前端页面的
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录