如何将循环爬取的球队名单数据保存至CSV文件?
问题解决:保存循环中所有爬取的球队数据
你的问题出在每次循环都用df.to_csv('Players.csv')直接覆盖文件,所以最终只有最后一次循环的数据被保留。下面提供两种可行的解决方法:
方法一:先收集所有数据再统一保存
先初始化一个空的DataFrame,每次爬取到球队数据后,将其追加到这个空DataFrame中,循环结束后一次性导出到CSV:
import pandas as pd import time team = ['Toronto Maple Leafs', 'Montreal Canadiens', 'Boston Bruins', 'Chicago Blackhawks', 'Detroit Red Wings', 'New York Rangers'] code = ['TOR', 'MTL', 'BOS', 'CHI', 'DET', 'NYR'] # 初始化空DataFrame用于存储所有数据 all_players = pd.DataFrame() for i in range(0, len(code)): codes = code[i] teams = team[i] df = pd.read_html(f'https://www.hockey-reference.com/teams/{codes}/#roster', match='Roster') df = df[0] df = df[['Player']] df = df.assign(Team=[teams]*len(df), Rating=['99']*len(df)) print(df) time.sleep(5) # 将当前球队数据追加到总DataFrame all_players = pd.concat([all_players, df], ignore_index=True) # 统一保存所有数据 all_players.to_csv('Players.csv', index=False) print("Saved!")
方法二:使用追加模式写入CSV
每次写入时指定mode='a'(追加模式),同时控制表头只在第一次写入时添加:
import pandas as pd import time team = ['Toronto Maple Leafs', 'Montreal Canadiens', 'Boston Bruins', 'Chicago Blackhawks', 'Detroit Red Wings', 'New York Rangers'] code = ['TOR', 'MTL', 'BOS', 'CHI', 'DET', 'NYR'] for i in range(0, len(code)): codes = code[i] teams = team[i] df = pd.read_html(f'https://www.hockey-reference.com/teams/{codes}/#roster', match='Roster') df = df[0] df = df[['Player']] df = df.assign(Team=[teams]*len(df), Rating=['99']*len(df)) print(df) time.sleep(5) # 第一次写入时添加表头,后续追加时不添加 df.to_csv('Players.csv', mode='a', index=False, header=(i==0)) print("Saved!")
两种方法都能解决你的问题,方法一更适合数据量不大的场景,方便后续对所有数据做统一处理;方法二则适合边爬边存,节省内存。
内容的提问来源于stack exchange,提问作者ItzzSalmon
相关产品推荐
相关产品推荐

