Python爬取OTEXA数据时pandas DataFrame追加到主表为空问题求解
问题根因
- 主表变量未接收追加函数返回值:
append_to_report_table返回拼接后的新DataFrame,但你在两个循环分支中都没有将返回值赋值回当前主表变量,导致每次循环传入的主表始终是初始空值,触发入参为空的问题。- hts分支:仅将返回值赋值给未使用的
append_report变量,未更新hts_report - catdata分支:完全没有接收返回值,
report_table始终为初始空DataFrame
- hts分支:仅将返回值赋值给未使用的
- 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避免兼容问题
修复优化方案
关键代码修改点
- 修正
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
- 修正
filename_splitter的边界逻辑
def filename_splitter(link): filename = link.rsplit('/', 1) return filename[1] if len(filename) > 1 else link
- 替换弃用的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
- 修正主循环的变量赋值逻辑
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
相关产品推荐
相关产品推荐

