如何使用BS4批量爬取Futbin.com多位球员数据并存储至DataFrame
批量爬取Futbin多位FIFA球员数据并保存到DataFrame的解决方案
问题背景
我之前手里有一份只能爬取单个Futbin球员数据的代码,但怎么改都没法适配批量爬取多位球员的需求。现在需要把这份代码改造一下,实现批量爬取指定球员列表的数据,最后保存到DataFrame里。原单个球员的爬取代码和目标爬取的球员URL列表如下:
原单个球员爬取代码:
import requests import pandas as pd from bs4 import BeautifulSoup url = "https://www.futbin.com/21/player/541/lionel-messi" soup = BeautifulSoup(requests.get(url).content, "html.parser") data = {} for s in soup.select(".left_stat_name"): data[s.get_text(strip=True)] = s.find_next(class_="stat_val").get_text( strip=True ) print(pd.DataFrame([data]).T)
目标爬取的球员URL列表:
urls = ["https://www.futbin.com/21/player/541/lionel-messi", 'https://www.futbin.com/21/player/529/kylian-mbappe', 'https://www.futbin.com/21/player/542/cristiano-ronaldo']
简便的批量爬取实现方法
其实改造起来很简单,核心思路就是把单个球员的爬取逻辑封装成一个函数,然后遍历你的URL列表,逐个爬取数据并收集起来,最后统一转换成DataFrame就行。我还特意加上了球员名称的提取,让最终的表格数据更清晰:
import requests import pandas as pd from bs4 import BeautifulSoup def scrape_player_data(url): # 发送请求并解析页面内容 response = requests.get(url) soup = BeautifulSoup(response.content, "html.parser") # 从URL中提取球员名称(比从页面爬取更快捷) player_name = url.split("/")[-1].replace("-", " ").title() # 提取球员的各项数据 data = {"Player Name": player_name} for s in soup.select(".left_stat_name"): stat_name = s.get_text(strip=True) stat_value = s.find_next(class_="stat_val").get_text(strip=True) data[stat_name] = stat_value return data # 你的目标球员URL列表 urls = ["https://www.futbin.com/21/player/541/lionel-messi", 'https://www.futbin.com/21/player/529/kylian-mbappe', 'https://www.futbin.com/21/player/542/cristiano-ronaldo'] # 批量爬取所有球员的数据 all_players_data = [scrape_player_data(url) for url in urls] # 把收集到的数据转换成DataFrame df = pd.DataFrame(all_players_data) # 打印查看结果(可选操作) print(df) # 如果需要保存到本地文件,可以用这行代码(可选操作) # df.to_csv("fifa_players_stats.csv", index=False)
代码细节说明
- 封装的
scrape_player_data函数负责处理单个球员的爬取:发送请求、解析页面、提取名称和各项数据,最后返回一个包含该球员所有信息的字典。 - 用列表推导式遍历URL列表,一次性收集所有球员的数据,写法简洁高效。
- 把字典列表传给
pd.DataFrame()后,自动生成规整的表格:每一行对应一个球员,每一列对应一项属性(比如速度、射门等)。 - 最后还加上了可选的CSV保存功能,方便你后续做数据分析或者存档。
内容的提问来源于stack exchange,提问作者MLP99




