Python中for循环存储各国GoogleNews到DataFrame仅保留最后结果怎么办
代码问题定位与修复方案
运行后仅保留最后一个国家的新闻结果,核心是三处代码逻辑/兼容性问题,和网络请求本身无关:
- 国家标记列赋值位置错误:原代码是先把当前国家的新闻数据追加到总表,再给整个总表新增
Country列并赋值为当前循环的国家值。这会导致每轮循环都会把总表里之前所有国家行的Country值全部覆盖,等循环走到最后一个国家时,全表的国家标记都会变成最后一个国家的值,做国家维度筛选时就会误以为之前的国家数据全部丢失。 - 依赖了pandas已废弃/移除的
append()方法:高版本pandas已经下线DataFrame.append()接口,如果运行环境版本不兼容,会出现数据合并失效、仅保留最后一次结果的问题。 - 变量名不匹配:前面定义的国家列表是
countries,循环内写的是countries1,如果该变量没有提前正确赋值,会导致循环遍历对象不符合预期。
修复后的实现逻辑
- 每轮循环拿到当前国家的新闻数据后,先在当前国家对应的小DataFrame上新增
Country标记列,再将标记好的小表合并到总表,彻底避免跨轮次的标记覆盖问题。 - 用
pd.concat()替代老旧的append()方法合并数据,兼容所有pandas版本。 - 每次新建GoogleNews实例后调用
clear()方法清空内置的历史结果缓存,避免不同国家的新闻结果串接。 - 统一变量名,确保循环遍历的是之前提取的完整国家列表。
修复后的完整可运行代码
import time import pandas as pd from tqdm.notebook import tqdm from GoogleNews import GoogleNews from newspaper import Article # 复用已提取的国家列表,保证变量名一致 countries = df["Country"].unique().tolist() total_news_df = pd.DataFrame() # 初始化空的总结果表 # 替换为你自己的指定时间范围 Start_date = "01/01/2024" End_date = "01/31/2024" for country in tqdm(countries): # 每轮新建独立的GoogleNews实例,避免缓存串数据 googlenews = GoogleNews(start=Start_date, end=End_date) googlenews.set_lang('en') googlenews.set_encode('utf-8') # 清空实例内置的历史结果缓存 googlenews.clear() # 请求当前国家的匹配新闻 googlenews.get_news(country) result = googlenews.result() # 跳过无结果的国家,避免空表合并报错 if not result: continue # 将当前国家的结果转为小DataFrame country_news_df = pd.DataFrame(result) # 核心修复:给当前小表打国家标记,不直接操作总表 country_news_df['Country'] = country # 用concat合并到总表,替代老旧的append方法 total_news_df = pd.concat([total_news_df, country_news_df], ignore_index=True) # 加1秒延时,避免请求过于频繁被限流 time.sleep(1) # 查看最终合并结果 total_news_df.head()
代码优化说明
- 增加空结果判断:如果某个国家在指定时间范围内没有返回匹配新闻,代码会直接跳过,不会因为空值合并导致后续逻辑报错。
- 合并数据时设置
ignore_index=True,会重新整理总表的索引,避免合并后索引重复混乱。 - 增加固定请求延时,降低被GoogleNews反爬拦截的概率。
内容的提问来源于stack exchange,提问作者Nirav Prajapati
相关产品推荐
相关产品推荐

