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

python使用飞书开发平台api,爬取多维表格或者电子表格的数据,并写到本地文件

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

python使用飞书开发平台api,爬取多维表格或者电子表格的数据,并写到本地文件

使用飞书开发平台提供的api接口,去爬取多维表格的数据,并保存在本地,也可以爬取电子表格的数据,但是电子表格的相关api在我使用的时候是不提供调试的,可以将电子表格转变成多维表格第一次看这种api文档来书写代码完成业务逻辑,并且我本身是用的java语言,对于python并不是很熟悉,使用python代码写的并不是很好,只是看见csdn上面关于飞书api的帖子较少,(当时自己也搜过,没有看见自己想要的),所以才写了这个博客(也是自己第一次写),希望给大家做一个参考,如果有什么问题的话,也希望大家指正大概的流程:        1:第一步在飞书开发者后台创建自己的应用,并赋予相应的权限        2:看开发文档,相应的api,那些参数的含义,调试后,它那里会有写好的代码(响应体),写         代码逻辑获取自己想要的内容 我的代码大概的流程:控制台读取相关参数,加密写入到本地的配置文件,通过读取配置文件的相关参数,获取信息,传参,爬取数据import http.clientimport jsonimport hashlibfrom grammar import TransferParametersAndEncryptionfrom urllib.parse import urlparse, parse_qsimport hashlibimport xml.etree.ElementTree as ETimport base64#加密:md5加密是不可逆的,这里应该使用其他的加密方式,AES或bcrypt,sm4,但是我导报的时候会出现问题,这里需要改进def encrypt(parameter):    # 使用MD5进行密码加密,你也可以选择其他更安全的加密算法    hash_object = hashlib.md5(parameter.encode())    return hash_object.hexdigest()#传参:向xml写入table的一些信息def input_parameters():    # 获取app_id,app_secret,url    path = input("配置文件保存的地址 ")    user_appp_id = input("请输入app_id ")    user_app_secret = input("请输入app_secret ")    url = input("多维表格的url地址: ")    table_name = input("请输入你要爬取的表名 ")    # 加密appid,appSecret    encrypted_app_id = encrypt(user_appp_id)    encrypted_app_secret = encrypt(user_app_secret)    # 创建XML文档    root = ET.Element('table_info')    user_element = ET.SubElement(root, 'Path')    user_element.text = path    # 先使用原来的明文    password_element = ET.SubElement(root, 'User_appp_id')    # password_element.text = encrypted_app_id    password_element.text = user_appp_id    password_element = ET.SubElement(root, 'User_app_secret')    # password_element.text = encrypted_app_secret    password_element.text = user_app_secret    password_element = ET.SubElement(root, 'Url')    password_element.text = url    password_element = ET.SubElement(root, 'Table_name')    password_element.text = table_name    # 创建XML文档对象    tree = ET.ElementTree(root)    # 将XML文档保存到文件    tree.write(path, encoding='utf-8', xml_declaration=True)    print("用户名和密码已保存到XML配置文件中。")#获取xml中的信息,以字典的类型返回def get_parameters():    # 获取app_id,app_secret,url    path = input("爬取数据所需要的配置文件的地址 ")    tree = ET.parse(path)    root = tree.getroot()    path = None    user_appp_id = None    user_app_secret = None    url = None    table_name = None    table_info_dir = {}    for child in root:        if child.tag == 'Path':            table_info_dir["Path"] = child.text        elif child.tag == 'User_appp_id':            table_info_dir["User_appp_id"] = child.text        elif child.tag == 'User_app_secret':            table_info_dir["User_app_secret"] = child.text        elif child.tag == 'Url':            table_info_dir["Url"] = child.text        elif child.tag == 'Table_name':            table_info_dir["Table_name"] = child.text    # 解密密码    # password = decrypt_password(encrypted_password)    return table_info_dir#获取access_tokendef accss_token(app_id,app_secret):    conn = http.client.HTTPSConnection("open.feishu.cn")    payload = json.dumps({        "app_id": app_id,        "app_secret": app_secret    })    headers = {        'Content-Type': 'application/json'    }    conn.request("POST", "/open-apis/auth/v3/app_access_token/internal", payload, headers)    res = conn.getresponse()    data = res.read()    # 格式化成json    data_dir = json.loads(data.decode("utf-8"))    print(data_dir["app_access_token"])    return data_dir['app_access_token']#获取app_token#最好是使用api调用,返回的结果与传入的多维表格名字进行判断,再获取对应的token,但是他的api调用的话返回的是null#这里我采用的是截取传入的连接中的url的值def get_app_token(url):    app_token = url.split('/')[-1].split('?')[0]    if app_token:        print(app_token)        return app_token    else:        return None#获取table_id#这里通过url截取,也可以通过官方api获取#如果传入的sheetID不是tableid而是子表名,可以通过api获取字典,获取相应的值,放到字典中通过key返回相应的tableIDdef get_table_id(url):    parsed_url = urlparse(url)    query_params = parse_qs(parsed_url.query)    table_param = query_params.get('table')    if table_param:        table_id = table_param[0]        print(table_id)        return table_id    else:        print("table parameter not found in the URL.")        return Nonedef get_table_idByName(url,tableName,app_id,app_secret):    conn = http.client.HTTPSConnection("open.feishu.cn")    payload = ''    headers = {        'Authorization': 'Bearer '+accss_token(app_id,app_secret)    }    conn.request("GET", "/open-apis/bitable/v1/apps/"+get_app_token(url)+"/tables?page_size=100", payload, headers)    res = conn.getresponse()    data = res.read()    data_dir = json.loads(data)    table_info_list = data_dir["data"]["items"]    table_name = "内容类型"    #print(data_dir["data"]["items"])    table_info_dir = {}    for table_info in table_info_list:        table_info_dir[table_info["name"]] = table_info["table_id"]    print(table_info_dir[tableName])    return table_info_dir[tableName]#写入到本地文件def write_data(url,tableName,app_id,app_secret):    conn = http.client.HTTPSConnection("open.feishu.cn")    payload = ''    path = input("爬取数据保存的地址 ")    headers = {      'Authorization': 'Bearer '+accss_token(app_id,app_secret)    }    conn.request("GET", "/open-apis/bitable/v1/apps/"+get_app_token(url)+"/tables/"+get_table_idByName(url,tableName,app_id,app_secret)+"/records?page_size=500", payload, headers)    res = conn.getresponse()    data = res.read()    #print(data.decode("utf-8"))    #print(data['data'])    #格式化成json    data_dir=json.loads(data.decode("utf-8"))    #数据的list,里面每一条记录是以json存在    value_list=data_dir['data']["items"]    #输出查看list    #print(value_list)    count=0    for kv in value_list:        result = ""        for key, value in kv['fields'].items():            result += f"{key}: {value}|^|"        with open(path , 'a') as file:            # 文件路径为完整的绝对路径 "/Users/username/Documents/output.txt"            file.write(result)            file.write("\n")        print(result)        count+=1def run():    input_parameters()    table_info_dir = get_parameters()    print(table_info_dir)    write_data(table_info_dir['Url'],table_info_dir['Table_name'],table_info_dir['User_appp_id'],table_info_dir['User_app_secret'])if __name__ == '__main__':    url = 'https://hatuxjd72ne.feishu.cn/base/MvPfbLKcsaHSoUsGJdqcSi0Xnde?table=tbldgaotuABaSQUT&view=vewovUyg71'    #path = 'D:/migu/data/data2.txt'    tableName='page_id'    #write_data(url,path,tableName)    run()    #write_data(t)

来源地址:https://blog.csdn.net/m0_71695472/article/details/131856404

免责声明:

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

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

python使用飞书开发平台api,爬取多维表格或者电子表格的数据,并写到本地文件

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

下载Word文档

编程热搜

  • 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动态编译

目录