Python爬取NBA2017-2018赛季数据实战

爬取目标

  • 爬取NBA2017-2018赛季 球队的球赛数据
  • 并保存到.csv 文件中

难点

  • 经分析得知,要获取的数据是动态生产的,经过抓包得到目标链接
  • json格式数据提取的层级分析

缺点

  • 对比赛时间部分,分析不足,只是给出了具体年月,没有日期和具体几点
  • 代码方面优化不足

代码部分

以下代码仅供学习参考,请勿用作其它非法用途。
# -*- coding: utf-8 -*-
# @Date:   2018-04-27 20:13:28
# @Last Modified by:   Happydong
# @Last Modified time: 2018-04-28 10:19:34
# 引入模块部分
import requests
from bs4 import BeautifulSoup
import bs4
import json
import csv

#  定义get_Html()函数
#  目的:获取url链接的网页源码
#  @param $url string
#  @return string
     
def get_Html(url):
    # 设定模拟浏览器访问的user_agent
    user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.3"
    # 设定headers中的user_agent
    headers = {'User-Agent': user_agent}
    # 获取目标网页源代码
    r = requests.get(url, headers=headers)
    return r.text 

# 定义目标url
srcUrl = 'http://china.nba.com/teams/schedule/#!/clippers'
# 调用get_Html() 函数
ghtml = get_Html(srcUrl)
# 创建BeautifulSoup对象
soup =  BeautifulSoup(ghtml, 'html.parser', from_encoding='utf-8')


# 获取目标链接地址部分
# 爬取目标链接存储位置声明
team_links = []
# 获取所有a标记中的链接和内容
for box in ["east-box", 'west-box']:
    for a in soup.find(class_=box).find_all('a'):
        # 获取球队英文名字
        box_name = a.get('href').strip('/')
        # 把爬取球队名字,拼接成目标链接地址
        target_url = "http://china.nba.com/static/data/team/schedule_"+box_name+".json"
        # 把link加入之前定义的列表中
        team_links.append(target_url)


# 获取目标数据部分
# 比赛数据存储位置
match_target = []
for link in team_links:
    r = requests.get(link)
    # 获取的r文本 就是json字符串
    json_response = r.content.decode()
    # 将已编码的 JSON 字符串解码为 Python 对象
    dict_json = json.loads(json_response)

    # 处理json数据部分
    for item in dict_json['payload']['monthGroups']:
        # 处理时间部分
        if item['number'] < 13 and item['number'] >9:
            scheduleYear = '2017'
        else:
            scheduleYear = '2018'
        # 比赛时间
        match_scheduleYM = scheduleYear + item['name']
        # 处理具体比赛数据部分
        for i in item['games']:
            # for j in i:
            # 客场方球队名称
            awayTeam = i['awayTeam']['profile']['displayAbbr']
            # 主场球队名称
            homeTeam = i['homeTeam']['profile']['displayAbbr']
            # 比赛结果
            scoreStatus = i['winOrLoss']
            # 对方比赛得分
            oppTeamScore = i['oppTeamScore']
            # 我方比赛得分
            teamScore = i['teamScore']
            # 比赛
            arenaName = i['profile']['arenaName']
            # 组装数据
            match_info = (match_scheduleYM ,homeTeam+'vs'+awayTeam ,str(teamScore)+'-'+str(oppTeamScore), scoreStatus ,arenaName)
            # 把组装好的数据写入列表中
            match_target.append(match_info)

# 目标数据保存到csv文件部分
# 定义表头
header_info = ['比赛时间','主场球队vs客场球队','比分','比赛结果','比赛地点']
# 写入数据
with open('match_box.csv', 'w') as f:
    f_csv = csv.writer(f)
    # 写表头
    f_csv.writerow(header_info)
    # 写数据
    f_csv.writerows(match_target)

爬取结果部分截图

爬取结果部分截图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,302评论 19 139
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 8,189评论 1 3
  • 2017年8月7日 天气晴 星期一 我今天闯了29关,我被老师表扬了。老师说我下次还要不要继续加油,我说要。
    琦琦花仙子小月阅读 1,837评论 1 0
  • 逢年过节,拿出部分福利经费慰问来队官兵家属,是很多单位的惯常做法。今年,某摩步团看望来队家属的慰问品跟往年不一样,...
    军营红娘晓晓_阅读 3,935评论 0 1

友情链接更多精彩内容