向pandas DataFrame回填GoogleNews搜索关键词报KeyError及跨年度按月爬取合并问题
两类核心问题的原因定位与解决方法
1. KeyError: 'compn'报错的修复
- 报错触发场景:执行新闻关键词回填逻辑时,运行
dict['Ticker'] = df['compn'][ind]代码,在Google Colab环境下抛出pandas列不存在的异常,最终导致生成的新闻数据集无法匹配对应的搜索公司主体。 - 根本原因:GoogleNews搜索接口返回的原始结果DataFrame,本身不存在
compn列,代码错误将“需要新增的标记列”等同于“已存在的返回列”进行索引取值。 - 修复方案:跳过对不存在列的取值操作,直接复用外层遍历公司列表的循环变量完成字段回填
- 正确逻辑示例:
company_list = ["Morgan Stanley","Evercore ISI","JP Morgan"] total_news_records = [] # 遍历公司列表的外层循环 for current_company in company_list: # 初始化GoogleNews搜索、生成分页结果的逻辑 gnews = GoogleNews(start=search_start, end=search_end) gnews.search(current_company) search_result_df = gnews.get_page() # 逐行解析新闻内容 for idx, row in search_result_df.iterrows(): single_news = {} # 直接赋值当前循环的公司名,无需从DataFrame读取不存在的列 single_news['Ticker'] = current_company # 后续调用Article模块下载、解析新闻,填充其余字段 total_news_records.append(single_news) - 优化说明:无需在原始搜索返回的DataFrame中预写入
compn列再取值,直接复用循环状态变量的写法更简洁,也从根源上避免了列不存在的报错。
- 正确逻辑示例:
2. 跨全周期爬取的实现方案
- 平台限制:GoogleNews单次搜索最多返回约200篇新闻,现有固定单时间范围的搜索逻辑,无法覆盖2019年10月1日至2020年10月的全量相关新闻。
- 核心实现思路:按时间粒度拆分目标周期,逐段执行搜索,累加所有分段结果生成统一数据集。
- 落地步骤:
- 时间块拆分:将全周期按自然月拆分为独立的搜索时间区间,单区间内的某公司相关新闻量通常远低于200篇的返回上限,不会触发结果截断。
- 循环搜索:对每个拆分后的时间块,遍历所有目标公司关键词,逐组执行搜索、解析流程。
- 结果整合:将每个搜索任务产出的单条新闻记录,统一追加到全局结果列表中,所有循环结束后一次性转换为最终的整合DataFrame。
- 时间拆分逻辑示例:
import pandas as pd from dateutil.relativedelta import relativedelta # 定义全周期爬取范围 total_start = pd.to_datetime("2019-10-01") total_end = pd.to_datetime("2020-10-31") global_result = [] current_segment_start = total_start while current_segment_start <= total_end: # 计算当前月度时间块的结束边界 current_segment_end = current_segment_start + relativedelta(months=1) - relativedelta(days=1) # 对每个公司在当前时间块执行搜索、解析逻辑,把单条结果append到global_result for company in company_list: # 单段搜索、解析逻辑同修复后的单流程 # 移动到下一个时间块 current_segment_start = current_segment_start + relativedelta(months=1) # 所有循环完成后生成最终整合数据集 final_dataset = pd.DataFrame(global_result) - 适配说明:如果某单月内特定公司的相关新闻量接近200篇的返回上限,可以将拆分粒度进一步调整为按周,确保单段搜索的结果不会被平台截断。
内容的提问来源于stack exchange,提问作者barun bodhak
相关产品推荐
相关产品推荐

