0


使用 Selenium 自动化爬取 NBA 球员数据并保存到 Excel

前言

随着大数据时代的来临,数据获取变得尤为重要,如何高效地从网站中提取有用数据是一个热门话题。本文将详细讲解如何使用 Python 的 Selenium 库自动化爬取 NBA 球员的统计数据,并将数据保存到 Excel 文件中。通过这一实战案例,初学者可以学习到网页自动化、数据抓取、分页处理以及如何保存数据到 Excel 文件。


一、环境配置

在正式开始之前,我们需要搭建好开发环境并安装必要的库和工具。

1.1 安装 Python 依赖库

首先,确保你已经安装了 Python,并可以通过终端或命令提示符执行以下命令来安装必要的依赖库:

pip install selenium pandas openpyxl 
  • Selenium:这是一个用于自动化网页操作的工具,可以模拟用户行为如点击、输入等,本文用它来抓取网页数据。
  • Pandas:Python 的数据分析库,负责将爬取的数据进行整理,并输出为 Excel 文件。
  • openpyxl:Pandas 中用于操作 Excel 文件的依赖库。

1.2 下载 ChromeDriver

Selenium 需要浏览器驱动(如 ChromeDriver)来控制浏览器。具体步骤如下:

  1. 访问 ChromeDriver 下载页面,根据你的 Chrome 浏览器版本下载对应的驱动程序。
  2. 下载并解压后,将 chromedriver.exe 放到你可以找到的路径(如项目的根目录)。

如果你不确定 Chrome 浏览器的版本号,可以点击右上角的 "菜单 > 帮助 > 关于 Google Chrome" 查看。


二、目标网站分析

2.1 目标网站

我们选择的目标网站是 NBA 中国官网的球员统计页面,这个页面会列出当前赛季的所有球员数据,包括排名、球员姓名、得分、篮板、助攻等详细信息。网址如下:

  • NBA 中国球员统计页面: NBA中国官方网站

页面中的数据通过 HTML 表格显示,每一行数据代表一位球员的统计信息。为了抓取多页数据,我们需要处理分页逻辑。

2.2 分析数据结构

打开页面后,可以通过浏览器的 开发者工具(快捷键 F12)查看网页结构。球员数据放在

<table>

标签下,每一行

<tr>

表示一位球员的数据,每一个单元格

<td>

包含具体的数据项,比如排名、得分、篮板等。

分页按钮位于页面底部,我们需要模拟点击分页按钮来获取下一页的数据。


三、Selenium 爬虫代码实现

接下来,我们将通过 Python 实现自动化爬取 NBA 球员数据的程序。代码详细介绍了 Selenium 的使用方法,包括如何打开网页、定位元素、抓取表格内容、翻页处理和数据保存。

3.1 完整代码

import os
import time
import pandas as pd
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class NBA:
    def __init__(self):
        # 初始化 WebDriver 服务
        self.service = Service('./driver/chromedriver.exe')  # 指定 ChromeDriver 的路径
        self.options = webdriver.ChromeOptions()
        self.driver = webdriver.Chrome(service=self.service)
        self.url = 'https://china.nba.cn/statistics/playerstats'  # NBA 球员数据页面
        # 初始化数据列表
        self.data_list = []

    def getData(self, page):
        # 打开目标网站
        self.driver.get(self.url)
        wait = WebDriverWait(self.driver, 10)  # 显式等待时间设置为10秒

        for i in range(page):
            if i != 0:
                # 等待分页按钮加载并点击下一页
                try:
                    next_page_btn = wait.until(
                        EC.element_to_be_clickable((By.XPATH, '//li[@class="page-next page-btn"]')))
                    next_page_btn.click()
                except Exception as e:
                    print(f"翻页失败: {e}")
                    break
                time.sleep(2)  # 等待页面内容刷新
            print(f'开始爬取第{i + 1}页的数据')

            try:
                # 等待表格内容加载完成
                table = wait.until(EC.presence_of_element_located(
                    (By.XPATH, "//*[@id='app']/div[2]/div/div[2]/section[1]/div[3]/div/div/div/table/tbody")))
                rows = table.find_elements(By.XPATH, "//tr")

                # 遍历每一行数据
                for row in rows:
                    cols = row.find_elements(By.TAG_NAME, "td")
                    # 提取每一列数据
                    data = {
                        "排名": cols[0].text,
                        "球员姓名": cols[1].text.replace('\n', '.'),  # 处理球员姓名中的换行符
                        "球队": cols[2].text,
                        "比赛场次": cols[3].text,
                        "出场时间": cols[4].text,
                        "得分": cols[5].text,
                        "篮板": cols[6].text,
                        "助攻": cols[7].text,
                        "抢断": cols[8].text,
                        "盖帽": cols[9].text,
                        "投篮命中率": cols[10].text,
                        "三分命中数": cols[11].text,
                        "三分命中率": cols[12].text,
                        "罚球命中率": cols[13].text,
                    }
                    self.data_list.append(data)  # 将每行数据存入列表
                print(f"第{i + 1}页数据抓取成功")
            except Exception as e:
                print(f"抓取数据失败: {e}")

        self.save_data()  # 抓取完成后保存数据

    def save_data(self):
        output_file = "NBA球员数据.xlsx"
        # 检查文件是否已存在
        if os.path.exists(output_file):
            # 如果文件存在,读取现有数据
            df = pd.read_excel(output_file)
            # 将新数据转换为 DataFrame 并合并
            new_data = pd.DataFrame(self.data_list)
            df = pd.concat([df, new_data], ignore_index=True)
        else:
            # 如果文件不存在,直接创建
            df = pd.DataFrame(self.data_list)
        df.to_excel(output_file, index=False)  # 保存数据到 Excel 文件
        print(f"数据成功保存到 {output_file}")

    def quit(self):
        self.driver.quit()  # 关闭浏览器

# 主程序入口
if __name__ == '__main__':
    nba = NBA()
    nba.getData(5)  # 爬取前5页数据
    nba.quit()  # 结束时关闭浏览器

3.2 代码详解

1. 初始化 WebDriver

__init__

函数中,我们配置了 Selenium 的 ChromeDriver 路径,使用

webdriver.Chrome()

打开 Chrome 浏览器。还初始化了

self.data_list

,用于存储抓取到的数据。

self.service = Service('./driver/chromedriver.exe')  # 指定 ChromeDriver 的路径
self.driver = webdriver.Chrome(service=self.service)
self.url = 'https://china.nba.cn/statistics/playerstats'
2. 抓取数据
getData()

函数实现了数据的抓取和分页处理。首先,它使用

self.driver.get()

打开目标页面。然后在

for

循环中,每次抓取一页的数据,并点击 “下一页” 按钮。

每页数据的

<table>

标签使用 XPATH 进行定位,抓取表格中的所有

<tr>

,即每一行球员数据。使用

find_elements(By.TAG_NAME, "td")

遍历每一列并提取对应的数据。

3. 保存数据

save_data()

函数中,使用 Pandas 将抓取到的数据保存为 Excel 文件。如果文件已经存在,程序会读取旧数据并与新数据合并。

df = pd.concat([df, new_data], ignore_index=True)
4. 关闭浏览器

最后,

quit()

函数用于在程序运行结束时关闭浏览器,释放资源。


四、运行结果

运行该程序后,Selenium 会自动化打开浏览器,逐页抓取球员统计数据并将其保存到 Excel 文件

NBA球员数据.xlsx

中。

每个 Excel 文件都会包含所有爬取到的球员数据,如下所示:

| 排名 | 球员姓名 | 球队 | 比赛场次 | 出场时间 | 得分 | 篮板 |


本文转载自: https://blog.csdn.net/qq_63021160/article/details/142969430
版权归原作者 ༺༃余༒成༃༻ 所有, 如有侵权,请联系我们删除。

“使用 Selenium 自动化爬取 NBA 球员数据并保存到 Excel”的评论:

还没有评论