您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python如何爬取NBA虎扑球员数据
## 前言
在数据分析与体育研究的交叉领域,获取高质量的球员数据是开展工作的基础。作为国内最活跃的篮球社区之一,虎扑体育提供了丰富的NBA球员数据。本文将详细介绍如何使用Python从虎扑网站爬取NBA球员数据,包括技术选型、反爬策略、数据解析和存储等完整流程。
---
## 一、技术准备
### 1.1 所需工具库
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
from fake_useragent import UserAgent
建议使用Python 3.8+版本,并通过pip安装依赖:
pip install requests beautifulsoup4 pandas fake-useragent
以2022-23赛季球员数据为例:
https://nba.hupu.com/stats/players
页面特点: - 采用传统服务端渲染 - 数据存在于HTML表格中 - 无复杂JavaScript动态加载
通过浏览器开发者工具检查可见:
<table class="players_table">
<thead>...</thead>
<tbody>
<tr>
<td>排名</td>
<td><a href="/players/xxx">球员名</a></td>
<td>球队</td>
<td>得分</td>
...
</tr>
</tbody>
</table>
ua = UserAgent()
headers = {
'User-Agent': ua.random,
'Referer': 'https://nba.hupu.com/'
}
def get_page(url):
try:
resp = requests.get(url, headers=headers, timeout=10)
resp.raise_for_status()
resp.encoding = resp.apparent_encoding
return resp.text
except Exception as e:
print(f"请求失败: {e}")
return None
def parse_data(html):
soup = BeautifulSoup(html, 'lxml')
table = soup.find('table', {'class': 'players_table'})
data = []
for row in table.find('tbody').find_all('tr'):
cols = row.find_all('td')
player_data = {
'rank': cols[0].text.strip(),
'name': cols[1].a.text.strip(),
'team': cols[2].text.strip(),
'points': cols[3].text.strip(),
# 其他数据字段...
}
data.append(player_data)
return data
def random_delay():
time.sleep(random.uniform(1, 3))
proxies = {
'http': 'http://proxy_ip:port',
'https': 'https://proxy_ip:port'
}
response = requests.get(url, proxies=proxies)
try:
# 请求代码
except requests.exceptions.ProxyError:
# 代理异常处理
except requests.exceptions.SSLError:
# SSL证书异常
except requests.exceptions.Timeout:
# 超时重试逻辑
虎扑数据通常分页显示,需处理分页逻辑:
base_url = "https://nba.hupu.com/stats/players?page={}"
for page in range(1, 6): # 假设爬取5页
url = base_url.format(page)
html = get_page(url)
if html:
data = parse_data(html)
save_data(data)
random_delay()
def save_to_csv(data, filename):
df = pd.DataFrame(data)
df.to_csv(filename, index=False, encoding='utf_8_sig')
import pymysql
def save_to_mysql(data):
conn = pymysql.connect(host='localhost',
user='root',
password='123456',
database='nba')
try:
with conn.cursor() as cursor:
sql = """INSERT INTO players
(rank, name, team, points)
VALUES (%s, %s, %s, %s)"""
for item in data:
cursor.execute(sql, (
item['rank'],
item['name'],
item['team'],
item['points']
))
conn.commit()
finally:
conn.close()
# 处理空值
df = df.replace('--', None)
# 转换数据类型
df['points'] = pd.to_numeric(df['points'])
# 去除重复数据
df = df.drop_duplicates(subset=['name'])
print(df.info())
print(df.describe())
# 检查异常值
print(df[df['points'] > 40]) # 单场得分超过40分
使用aiohttp实现异步请求:
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
return await asyncio.gather(*tasks)
使用APScheduler定时执行:
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job('cron', hour=3)
def scheduled_job():
# 执行爬虫任务
print("开始定时爬取...")
sched.start()
本文详细介绍了使用Python爬取虎扑NBA球员数据的完整流程。通过合理的反爬策略和规范的爬取行为,我们可以高效获取所需数据。这些数据可用于: - 球员表现分析 - 球队战术研究 - 比赛预测模型 - 数据可视化项目
完整项目代码已托管至GitHub(示例仓库地址)。建议在实际使用时根据虎扑网站的最新变化调整解析逻辑,并始终遵守网络爬虫伦理规范。 “`
注:本文为技术分享,实际爬取时请遵守网站相关规定。虎扑数据更新频率通常为每日更新,建议在非高峰时段进行数据采集。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。