python爬取飞书文档内容

最近遇到一个工作量很大的需求,在一个文档内记录了200+个子文档,每个子文档的表头固定,需将200+个文档汇总到一起,如果手工操作费时又费力还废人,于是想通过python来批量处理这个项目。下面为实施步骤及对应代码:
1、在飞书创建企业应用
python爬取飞书文档内容_第1张图片

2、创建应用通过后会生成对应的appid和app_secret,以及打开该应用并授权的链接

##导包
import pandas as pd
import requests as req
from requests.exceptions import HTTPError
import re

###app token 获得应用授权
user_token_url="self-url"
app_url='https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal'
app_head={'Content-Type':"application/json; charset=utf-8"}
app_body={'app_id':'self-appid','app_secret':'自己应用的密码'}
app_tokent_text=req.post(url=app_url,headers=app_head,json=app_body)
app_tokent=app_tokent_text.json()['tenant_access_token']
print(app_tokent)

#user token 用户授权
access_url='https://open.feishu.cn/open-apis/authen/v1/access_token'
accest_body={
    "grant_type": "authorization_code",
    "code": "self-code" ##code是上一步授权后链接中会生成,需复制粘贴进来
}
access_header={
    "Authorization": 'Bearer %s' %app_tokent,
    "Content-Type": "application/json; charset=utf-8"
}
r=req.post(url=access_url,headers=access_header,json=accest_body)
print(r.json())
user_access_token=r.json()['data']['access_token']
print(user_access_token)

3、通过各种授权后,自定义函数取到飞书表格中的所有文件链接,并将各个文件中的内容读取并插入到指定文件

# get data,通过sheet_token,sheetId,自定义函数获取飞书excel文档中的内容
def get_data(sheet_token,sheetId):
    data_url='https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/%s/values/%s' %(sheet_token,sheetId)
    data_head={'Authorization':"Bearer %s"%user_access_token,
               'Content-Type':"application/json; charset=utf-8"}
    data=req.get(data_url,headers=data_head)
    return data

#自定义get sheet id 函数获取指定飞书excel文件中的第一个sheet_id
def get_sheetId(sheet_token):
    get_info_url='https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/%s/metainfo'%sheet_token
    print(get_info_url)
    info_head={'Authorization':"Bearer %s"%user_access_token,
               'Content-Type':"application/json; charset=utf-8"}
    info=req.get(get_info_url,headers=data_head)
#     print(info)
    return info.json()['data']['sheets'][0]['sheetId']

# 自定义get_sheetId() 函数获取指定文档中的所有文档链接地址
def token_list(data_frame):
    url_list=[]
    for i in data_frame:
        for i1 in i:
            if isinstance(i1,list):
                for d1 in i1:
                    if isinstance(d1,dict) and "link" in d1.keys():
                        url_list.append(d1['link'].split("/")[-1])
    return url_list

4、开始利用自定义函数批量汇总文件

##构造两个空列表
complete_list=[]
error_list=[]

##原始信息所在文件对应的sheet_token,即许多飞书文档汇总的文件,将
sheet_token='self-sheet token' 
data_head={'Authorization':"Bearer %s"%user_access_token,
               'Content-Type':"application/json; charset=utf-8"}
sheetId=get_sheetId(sheet_token=sheet_token)
data_detail=get_data(sheet_token=sheet_token,sheetId=sheetId).json()['data']['valueRange']['values'] ###获取的飞书文档内的详细信息

url_list=token_list(data_frame=url_list)

###新建一个文件存放输出结果
target_sheet_token='self-sheet token'  
target_url='https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/%s/values_append'%target_sheet_token

write_head={'Authorization':"Bearer %s"%user_access_token,
               'Content-Type':"application/json; charset=utf-8"}
stand_len=len('shtcnbxrFxFi05NUxAkv49Qzvsc')

for token in url_list:
    print(token)
    if len(token)==stand_len and token not in complete_list:
        sheet_token=token
        
        try:
            sheetId=get_sheetId(sheet_token=sheet_token)
            data=get_data(sheet_token=sheet_token,sheetId=sheetId)
        except:
            error_list.append(token)
        else:
            print(sheetId)
            print(data.json())
            data_detail=pd.DataFrame(data.json()['data']['valueRange']['values'][0:],columns=data.json()['data']['valueRange']['values'][0])  ###取结果信息data该json字段中key为data、valueRange、values三个字段中的所有值,取data、valueRange、values三个字段中第一个值作为列名
            for col in ['字段1','字段2','字段3','字段4','字段5','字段6']:
                if col not in data_detail.columns:
                    data_detail[col]=''
            data_detail[['字段1','字段2','字段3']]=data_detail[['字段1','字段2','字段3']].fillna('空值')  ###先对部分字段的的na进行填充
            result_data=data_detail[['字段1','字段2','字段3','字段4','字段5','字段6']].fillna(method='ffill')  ###用前面的值进行填充
            for u in result_data.values:
                write_body={"valueRange":{
                                      "range": "8bf964!A:N",####目标文件的数据存放范围,可直接指定sheet_id也可指定sheet_id+单元格范围
                                      "values": [list(u)]
                                     }
                        }

                req.post(target_url,headers=write_head,json=write_body) ###将数据写入目标飞书文档中
            complete_list.append(token)
    print(len(complete_list))
    print(len(error_list))

程序结束后可在目标文件中查看到汇总后的信息

你可能感兴趣的:(python,python,json,开发语言)