在数据分析和数据科学领域,数据采集是一个非常重要的步骤。最近,我完成了一个有趣的项目,使用Python和Selenium库来采集NBA球员的信息,并将这些数据存储到Excel表格中。在这篇文章中,我将分享我的代码实现和一些关键的编程技巧。
项目背景
NBA球员的统计数据对于球迷、分析师和球队管理层来说都是宝贵的资源。通过分析这些数据,我们可以了解球员的表现和潜在价值。然而,这些数据通常分散在不同的网页上,需要手动收集和整理。为了自动化这个过程,我决定编写一个Python脚本,使用Selenium库来模拟浏览器操作,分页采集数据,并使用pandas库来处理和存储数据。
环境准备
在开始之前,确保你的环境中安装了以下库:
pandas:用于数据处理和存储。selenium:用于模拟浏览器操作。webdriver:用于控制Chrome浏览器。你还需要下载ChromeDriver,这是Chrome浏览器的自动化驱动程序,确保其版本与你的Chrome浏览器相匹配。
代码实现
首先,我们导入了必要的库,并设置了日志记录,以便在爬取过程中跟踪进度和可能出现的错误。
import os
import time
import pandas as pd
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
import logging
# 初始化日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
接下来,我们定义了get_data函数,它接受一个URL作为参数,并使用Selenium打开网页,然后分页采集数据。
def get_data(url):
data = []
driver.get(url)
driver.implicitly_wait(20)
time.sleep(5)
for i in range(1, 6):
logging.info(f"正在爬取第{i}页数据")
# 找到球员数据表并遍历每一行
table = driver.find_element(By.XPATH, "//*[@id='app']/div[2]/div/div[2]/section[1]/div[3]/div/div/div/table/tbody")
rows = table.find_elements(By.TAG_NAME, "tr")
for row in rows:
cols = row.find_elements(By.TAG_NAME, "td")
player_data = {
"排名": cols[0].text,
"球员姓名": cols[1].text,
"球队": cols[2].text,
# ... 其他字段
}
data.append(player_data)
print(player_data)
driver.find_element(By.XPATH, "//*[@id='app']/div[2]/div/div[2]/section[1]/ul/li[7]/i").click()
time.sleep(5)
save_data(data)
logging.info(f"数据保存成功")
在采集完所有页面的数据后,我们定义了save_data函数,它将采集到的数据转换为pandas DataFrame,并保存到Excel文件中。
def save_data(data):
file = 'NBA球员数据.xlsx'
df = pd.DataFrame(data)
df.to_excel(file, index=False)
logging.info(f"数据保存成功")
最后,我们在主函数中调用get_data函数,并在完成后关闭浏览器。
if __name__ == '__main__':
url = "https://china.nba.cn/statistics/playerstats"
get_data(url)
driver.quit()
总结
通过这个项目,介绍了如何使用Selenium和pandas来采集和处理网页数据,还了解了如何使用日志记录来跟踪程序的执行情况。这个项目展示了自动化数据采集的强大能力,可以大大节省手动收集数据的时间和努力。