python爬虫系列之下载在线文档Excel(石墨文档)

一、简介

本文讲述使用python下载石墨在线文档中的Excel数据,下方有完整代码,方便食用。

  1. 思路

文档导出流程如下:

python爬虫系列之下载在线文档Excel(石墨文档)

使用抓包工具获取下载过程触发的接口,使用requests进行调用,即可完成下载。主要接口有三个,如下:获取文件名字接口、创建导出任务接口、查询任务进度接口。

""" 获取文件名字接口: https://shimo.im/lizard-api/files/Wr3DVRmBzVUdQkJQ?_=1653656675119&collaboratorCount=true 创建导出任务接口: https://shimo.im/lizard-api/files/Wr3DVRmBzVUdQkJQ/export?type=xlsx&file=O26gW9Ye5fcM35Ch&returnJson=1&name=%E3%80%90%E6%8A%96%E5%93%88%E3%80%91%EF%BC%88%E8%80%81%E8%99%8E%E7%BB%84%EF%BC%89%E6%8E%A8%E6%96%87%E9%A1%B9%E7%9B%AE%E7%94%B3%E8%AF%B7%E8%A1%A8%2B%E5%8F%91%E5%B8%83%E8%A1%A835&isAsync=1&timezoneOffset=-8 查询任务进度接口: https://shimo.im/lizard-api/files/Wr3DVRmBzVUdQkJQ/export/progress?taskId=O26gW9Ye5fcM35Ch:79921310 """

这三个接口之间的关系:

提供在线文档地址

通过在线文档地址获取excel文件名

通过excel名字创建导出任务

通过创建任务的id,查询任务进度

任务进度100%时,会返回文件down_url

二、实现步骤

1.数据准备

  • 提供石墨文档中excel文档地址唯一标识字段,以便进行下载,获取excel文档id
    document_id = Wr3DVRmBzVUdQkJQ

python爬虫系列之下载在线文档Excel(石墨文档)

cookie值获取,通过接口工具抓到的接口,获取cookie信息,首先需要进行登陆。这里我用的抓包工具为 fiddler
cookie_value = ********

python爬虫系列之下载在线文档Excel(石墨文档)

2.获取excel文件名接口

python爬虫系列之下载在线文档Excel(石墨文档)

获取文件名字接口,其中第一个参数为时间戳,调用该接口代码如下:

def get_excel_name(self): """ # 获取excel文件名 :return: """ timestamp = int(time() * 1000) excel_name_url = self.document_url f'?_={timestamp}&collaboratorCount=true' res = requests.get(url=excel_name_url, headers=self.headers) if res.json()['name']: print("文件名获取成功") return res.json()['name']

3.创建导出任务

创建导出任务,一个必填字段name为excel文件名。通过get_excel_name()获取,file字段为document_id= Wr3DVRmBzVUdQkJQ后缀中获取。
创建导出任务接口如下图

python爬虫系列之下载在线文档Excel(石墨文档)

def export_excel_task(self): document_name = self.get_excel_name() bfb = urllib.parse.quote(str(document_name)) # 转为 url 编码 document_id = str(self.document_url).split('/')[-1] export_url = self.document_url f'/export?type=xlsx&file={document_id}&returnJson=1&name={bfb}&isAsync=1&timezoneOffset=-8' res = requests.get(url=export_url, headers=self.headers) data_dict = res.json() if data_dict['status'] == 0: print("导出任务id获取成功") return data_dict['data']['taskId'] return "导出任务创建失败"

4. 查询进度进度,拿到文件下载地址

查询任务进度接口,在点击导出excel时会出现该接口信息,频繁调用该接口,当progress进度为100时,该接口返回值会出现file_url信息。

python爬虫系列之下载在线文档Excel(石墨文档)

def query_progess(self): taskId = self.export_excel_task() progress_url = self.document_url f'/export/progress?taskId={taskId}' start_time = time() file_url = '' # 循环调用查询进度接口,直到进度为100,出现下载url while True: sleep(3) res = requests.get(url=progress_url, headers = self.headers) data = res.json()['data'] progress = data['progress'] if progress == 100: file_url = data['downloadUrl'] break elif time() - start_time > 30: print("数据准备超时,请排查") break if file_url: print("excel文件下载地址获取成功") return file_url

5. 下载文件

石墨文档中该file_url会进行重定向,调用后通过返回值可以拿到真实的url
然后requests调用重定向后的url,就可以拿到文件流,写到excel文件中即可完成下载。

def download_file(self, file_name): file_url = self.query_progess() if file_url: # self.headers['content-type'] = 'application/octet-stream' res = requests.get(url=file_url) sleep(2) real_url = res.url real_res = requests.get(url=real_url) with open(file_name, 'wb') as f: f.write(real_res.content) print('下载成功,文件名: ' file_name) else: print("下载文件地址获取失败, 下载excel文件不成功")

三、完整代码

# -*- coding: UTF-8 -*-"""@Project :small-tools @File :shimo.py@Author :silen@Time :2022/5/27 22:06@Description : """import urllib.parsefrom datetime import datetimefrom time import time, sleepimport requestsclass ShiMo(): def __init__(self, document_id, cookie_value): # excel文档地址 self.document_url = 'https://shimo.im/lizard-api/files/' document_id self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53', 'Cookie': cookie_value, 'Accept': 'application/nd.shimo.v2 json', 'Accept-Encoding': 'gzip, deflate, br', 'Referer': f'https://shimo.im/sheets/{document_id}/nQlHS', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'Host': 'shimo.im', } def get_excel_name(self): """ # 获取excel文件名 :return: """ timestamp = int(time() * 1000) excel_name_url = self.document_url f'?_={timestamp}&collaboratorCount=true' res = requests.get(url=excel_name_url, headers=self.headers) if res.json()['name']: print("文件名获取成功") return res.json()['name'] def export_excel_task(self): document_name = self.get_excel_name() bfb = urllib.parse.quote(str(document_name)) # 转为 url 编码 document_id = str(self.document_url).split('/')[-1] export_url = self.document_url f'/export?type=xlsx&file={document_id}&returnJson=1&name={bfb}&isAsync=1&timezoneOffset=-8' res = requests.get(url=export_url, headers=self.headers) data_dict = res.json() if data_dict['status'] == 0: print("导出任务id获取成功") return data_dict['data']['taskId'] return "导出任务创建失败" def query_progess(self): taskId = self.export_excel_task() progress_url = self.document_url f'/export/progress?taskId={taskId}' start_time = time() file_url = '' # 循环调用查询进度接口,直到进度为100,出现下载url while True: sleep(3) res = requests.get(url=progress_url, headers = self.headers) data = res.json()['data'] progress = data['progress'] if progress == 100: file_url = data['downloadUrl'] break elif time() - start_time > 30: print("数据准备超时,请排查") break if file_url: print("excel文件下载地址获取成功") return file_url def download_file(self, file_name): file_url = self.query_progess() if file_url: # self.headers['content-type'] = 'application/octet-stream' res = requests.get(url=file_url) sleep(2) real_url = res.url real_res = requests.get(url=real_url) with open(file_name, 'wb') as f: f.write(real_res.content) print('下载成功,文件名: ' file_name) else: print("下载文件地址获取失败, 下载excel文件不成功")if __name__ == '__main__': """ 获取文件名字接口: https://shimo.im/lizard-api/files/Wr3DVRmBzVUdQkJQ?_=1653656675119&collaboratorCount=true 创建导出任务接口: https://shimo.im/lizard-api/files/Wr3DVRmBzVUdQkJQ/export?type=xlsx&file=O26gW9Ye5fcM35Ch&returnJson=1&name=%E3%80%90%E6%8A%96%E5%93%88%E3%80%91%EF%BC%88%E8%80%81%E8%99%8E%E7%BB%84%EF%BC%89%E6%8E%A8%E6%96%87%E9%A1%B9%E7%9B%AE%E7%94%B3%E8%AF%B7%E8%A1%A8%2B%E5%8F%91%E5%B8%83%E8%A1%A835&isAsync=1&timezoneOffset=-8 查询任务进度接口: https://shimo.im/lizard-api/files/Wr3DVRmBzVUdQkJQ/export/progress?taskId=O26gW9Ye5fcM35Ch:79921310 """ cookie_value = '***' document_id = 'Wr3DVRmBzVUdQkJQ' shimo = ShiMo(document_id, cookie_value) # 文档名称 name = shimo.get_excel_name() current_datetime = datetime.strftime(datetime.now(), '%Y_%m_%d_%H_%M_%S') file_name = f'{current_datetime name}.xlsx' shimo.download_file(file_name)

四、效果演示

运行脚本截图:

python爬虫系列之下载在线文档Excel(石墨文档)

成功下载的文档如下所示

python爬虫系列之下载在线文档Excel(石墨文档)

如果我的文章对你有帮助,点个关注呗 ~

如有疑问欢迎留言!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年4月30日 上午9:13
下一篇 2023年4月30日 上午9:29

相关推荐

  • 微搭低代码收费

    低代码开发平台是近年来兴起的一种新型软件开发方式,它以微搭为代表,为开发者提供了一种更加高效、快速的开发方式。与传统的软件开发相比,低代码开发平台可以大大减少开发时间和成本,因此备…

    科研百科 2024年3月4日
    108
  • 项目及项目管理

    项目及项目管理 项目及项目管理是现代商业中至关重要的一部分。项目管理者负责计划,组织,领导和控制项目活动,以确保项目按时完成,并在预算内完成。在项目管理中,有许多不同的工具和技术可…

    科研百科 2024年7月23日
    58
  • 西南科技大学科研分类标准

    西南科技大学科研分类标准 西南科技大学是一所以理学、工学、管理学为主的综合性大学,近年来在科技创新方面取得了显著成就。为了推动学校的科技创新,西南科技大学制定了一套科学的科研分类标…

    科研百科 2024年11月15日
    0
  • 您是内控型的人还是外控型的人?哪种对您有好处?(内控型和外控型属于什么)

    #好内容我来评# 我们人人都想很好地掌控自己的命运,相信您也一样,这其实还取决于您是内控型还是外控型的人?咱们一起来看一看! 朱利安·罗特在《您能主宰自己的命运吗》一书中认为人类在…

    科研百科 2024年5月11日
    111
  • 关于软件项目管理

    软件项目管理是软件开发过程中至关重要的一环。它涉及到计划、执行、监控和控制等多个方面,以确保项目按时、按质、按量完成。本文将探讨软件项目管理的基本概念、方法和挑战,并提供一些实用的…

    科研百科 2024年8月17日
    23
  • 发改委:规范中央预算内投资资金安排方式及项目管理(中央预算内投资项目管理办法)

    来源:经济日报-中国经济网 经济日报-中国经济网北京4月7日讯 国家发改委7日官网消息,为贯彻落实《政府投资条例》,充分发挥政府投资资金的引导带动作用,国家发展改革委正式印发《关于…

    科研百科 2022年12月4日
    337
  • AISIR面试入口

    AISIR面试入口: 探索人工智能领域证书的面试过程 随着人工智能领域的不断发展,越来越多的考生选择参加AISIR(AI Systems Engineering Internati…

    科研百科 2024年10月4日
    19
  • 供电工程管理系统

    供电工程管理系统 随着城市化进程的不断加速,供电工程的重要性越来越受到人们的关注。供电工程管理系统是一种用于管理供电工程的软件系统,它能够提高供电工程的效率和质量,减少能源消耗和环…

    科研百科 2024年9月30日
    19
  • 神经生物学科研项目名称是什么(神经生物学科研项目名称)

    神经生物学科研项目名称: 大脑与行为的相互作用 近年来,随着神经科学的发展,我们越来越清楚地认识到大脑与行为的相互作用。大脑是一个高度复杂的器官,它通过神经元之间的相互作用来控制着…

    科研百科 2024年8月4日
    37
  • 达索系统(Dassault Systèmes)——您需要知道的一切(达索系统百科)

    Dassault Systèmes是一家跨国软件公司,专门从事 3D 设计和产品生命周期管理 (PLM) 软件。该公司以其旗舰产品CATIA和SolidWorks而闻名。自成立以来…

    科研百科 2024年4月25日
    103