You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取OTEXA数据时pandas DataFrame追加到主表为空问题求解

问题根因
  • 主表变量未接收追加函数返回值:append_to_report_table返回拼接后的新DataFrame,但你在两个循环分支中都没有将返回值赋值回当前主表变量,导致每次循环传入的主表始终是初始空值,触发入参为空的问题。
    • hts分支:仅将返回值赋值给未使用的append_report变量,未更新hts_report
    • catdata分支:完全没有接收返回值,report_table始终为初始空DataFrame
  • hts分支保存时变量名错误:处理hts数据时最后调用save_report_table传入的是未在当前分支定义的report_table,而非存储数据的hts_report
  • 请求地址硬编码错误:post_request函数写死了请求url为全局的catdata地址,没有使用传入的param_info中对应接口的url,导致hts接口请求完全错误
  • 潜在边界缺陷:filename_splitter函数未处理链接不含/的场景,可能触发变量未定义报错
  • 版本兼容风险:pandas 1.4及以上版本已废弃DataFrame.append方法,建议改用pd.concat避免兼容问题
修复优化方案

关键代码修改点

  1. 修正post_request函数的请求地址
def post_request(param_info): 
    headers = CaseInsensitiveDict()
    headers["Accept"] = "application/json"
    headers["Content-Type"] = "application/json"
    # 改为使用param_info中的对应url,不要用全局硬编码的url
    resp = requests.post(param_info['url'], data=param_info, headers=headers)
    return resp.text
  1. 修正filename_splitter的边界逻辑
def filename_splitter(link):
    filename = link.rsplit('/', 1)
    return filename[1] if len(filename) > 1 else link
  1. 替换弃用的append方法为concat
def append_to_report_table(cleaned_dataframe, report_table):
    report = pd.concat([report_table, cleaned_dataframe], ignore_index=True)
    print("DataFrame appended to report_table.")
    print(report.shape)
    return report
  1. 修正主循环的变量赋值逻辑
for site_id, param_info in dictionary_of_different_sites_to_scrape.items():
    if len(param_info['cat']) > 3:
        hts_report = pd.DataFrame()
        for cat in cats2:
            param_info['cat'] = cat
            text = post_request(param_info)
            link = url_stripper(text)
            filename = filename_splitter(link)
            save_xls = save_xls_downloads(filename, link)
            fix_downloaded_xls(save_xls, param_info['cat'])
            delete_old_xls(filename)
            clean_xlsx = clean_new_xlsx(param_info['cat'])
            # 将返回值赋值回主表变量hts_report
            hts_report = append_to_report_table(clean_xlsx, hts_report)
        # 传入正确的主表变量hts_report
        save_report_table(site_id, hts_report)
    else:
        report_table = pd.DataFrame()
        for cat in cats:
            param_info['cat'] = cat
            # 删掉重复的post_request调用
            text = post_request(param_info)
            link = url_stripper(text)
            filename = filename_splitter(link)
            save_xls = save_xls_downloads(filename, link)
            fix_downloaded_xls(save_xls, param_info['cat'])
            delete_old_xls(filename)
            clean_xlsx = clean_new_xlsx(param_info['cat'])
            # 将返回值赋值回主表变量report_table
            report_table = append_to_report_table(clean_xlsx, report_table)
        save_report_table(site_id, report_table)

额外优化建议

  • 所有文件路径统一使用BASE_DIR变量拼接,不要硬编码路径,避免修改路径时漏改
  • 新增异常捕获逻辑,处理请求失败、文件不存在、Excel打开失败等异常场景,避免单个分类爬取失败导致整个脚本终止
  • 可以复用Excel实例,不要每次转格式都启动关闭一次Excel,大幅提升转格式效率

内容的提问来源于stack exchange,提问作者P2Insights

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:39:03