NBA球员数据的爬取

一、前言

二、正文

  • 我们先从首页Every NBA Team栏中解析出每个NBA球队的详情页地址。每个球队详情页地址的后缀在tr标枪下的th标签下的a标签的href属性值中。在这里插入图片描述

代码实现

import requests
from lxml import etree
import pandas as pd
from multiprocessing.dummy import Pool


# 定义的请求发起并实例etree对象函数
def get_response(url: str, header=None):
    """
    一个发起网址请求并将请求到的数据作为参数用于加载etree实例的函数
    :param url: 即将被请求的网址传入一个字符串对象
    :param header: 请求头参数
    :return: 返回网页源码的文档数据
    """
    response = requests.get(url, header)
    html_text = response.text
    etree_instance = etree.HTML(html_text)
    return etree_instance


# 定义的数据解析函数
def get_parse_data(etree_instance, parse: str):
    """
    这是一个用于xpath解析数据的函数
    :param etree_instance: 已加载的网页的etree实例对象
    :param parse: 用于解析网页的xpath解析式
    :return: 返回解析后的网页列表数据
    """
    parsed_data = etree_instance.xpath(parse)
    return parsed_data


def main():
    """
    这是一个用于主代码执行的函数
    :return: None
    """
    # 形成球队详情页网址列表
    team_url_list = []
    first_url_etree = get_response(first_url, header=HEADER)
    team_urls_data = get_parse_data(first_url_etree, '//div[@class="data_grid section_wrapper"]/div//tbody//th/a/@href')
    for team_url_last in team_urls_data:
        team_url_list.append(first_url + team_url_last)

在这里插入图片描述

  • 球队详情页中Roster栏中包含了现役NBA球员的的详情页地址,我们再通过解析该详情页中的球员详情页后缀获得球员详情页地址。球员详情页地址后缀。每位球员详情页地址后缀再各自的tr标签下的td标签下的a标签href属性值中。
    在这里插入图片描述

代码实现

# 为球队详情页的请求发起开启线程池提升发起请求的性能
    pool_team = Pool(10)  # 实例化线程池,在池中开启10个线程
    team_etree_list = pool_team.map(get_response, team_url_list)  # 运行阻塞操作

    # 形成运动员的详情网址页列表
    player_url_list = []
    for team_etree in team_etree_list:
        player_urls_data = get_parse_data(team_etree,
                                          '//div[@id="div_roster"]//tbody/tr/td[@data-stat="player"]/a/@href')
        for player_url_last in player_urls_data:
            player_url_list.append(first_url + player_url_last)

在这里插入图片描述

  • 在球员详情页我们便可以看到球员的Per Game数据。球员的Per Game数据中的 每条数据则在tr标签下的次级或多级子标签文本数据中。
    在这里插入图片描述

代码实现

    # 为球员详情页的请求发起开启线程池提升发起请求的性能
    pool_player = Pool(50)
    player_etree_list = pool_player.map(get_response, player_url_list)

    # 数据解析并整理装入list
    row_list = []
    for player_etree in player_etree_list:
        tag_tr = get_parse_data(player_etree, '//div[@id="div_per_game"]//tbody/tr')
        if len(tag_tr) > 0:
            for i in range(1, len(tag_tr) + 1):
                row_data = get_parse_data(player_etree, f'//div[@id="div_per_game"]//tbody/tr[{i}]//text()')
                player_name = get_parse_data(player_etree, '//div[@id="meta"]/div/h1/span/text()')
                row_data.insert(0, player_name[0])#对每条数据加上对应球员的名字
                row_list.append(row_data)
                
  • 我们将数据导入到csv文件中。并执行主程序。
    # 将数据进行存储
    pd.DataFrame(row_list).to_csv(r'C:\Users\86182\Desktop\nba.csv')


if __name__ == '__main__':
    HEADER = {
        'cookie': 'video_page_version=v_old_home; rpdid=|(YuRJkYmu)0JuYJ)JJlklJ; '
                  'fingerprint3=d48f30097e931acd003bd16b1e0da0b6; fingerprint_s=48c05993c7e96e45d53a5bb81febcfd4; '
                  'CURRENT_QUALITY=80; buvid3=E80947FB-68AE-24C7-0A76-01FC339BA3FF84388infoc; i-wanna-go-back=-1; '
                  'CURRENT_BLACKGAP=0; blackside_state=0; nostalgia_conf=-1; '
                  'fingerprint=1e01e23f37b6a29dc2e0d82e79925773; buvid_fp=E80947FB-68AE-24C7-0A76-01FC339BA3FF84388infoc; '
                  'buvid_fp_plain=undefined; DedeUserID=471523242; DedeUserID__ckMd5=aa662a7ff8076815; b_ut=5; '
                  'SESSDATA=0f04d292%2C1677359559%2C872f2%2A81; bili_jct=33bd9f2aa7a33396f503dda05cf13c40; sid=7415no1o; '
                  'CURRENT_FNVAL=80; bp_video_offset_471523242=699855600924754000; innersign=0',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54',
    }
    first_url = 'https://www.basketball-reference.com'
    main()

三、总结

我们将需求于所获得的结果进行对比。我们发现数据导入csv文件后自动将2009-10赛季、2010-11赛季、2011-12赛季翻译成了英语日期。但是我们用pandas对csv文件进行读取的时候他又会重新翻译回来,影响还是相对较小的,不知道大家是否能对此给出什么较好的建议。文章到此就结束了,多谢大家的观看!!!

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值