Python实现爬虫爬取NBA数据功能示例


Posted in Python onMay 28, 2018

本文实例讲述了Python实现爬虫爬取NBA数据功能。分享给大家供大家参考,具体如下:

爬取的网站为:stat-nba.com,这里爬取的是NBA2016-2017赛季常规赛至2017年1月7日的数据

改变url_header和url_tail即可爬取特定的其他数据。

源代码如下:

#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
import time
import urllib
from bs4 import BeautifulSoup
import re
from pyExcelerator import *
def getURLLists(url_header,url_tail,pages):
  """
  获取所有页面的URL列表
  """
  url_lists = []
  url_0 = url_header+'0'+url_tail
  print url_0
  url_lists.append(url_0)
  for i in range(1,pages+1):
    url_temp = url_header+str(i)+url_tail
    url_lists.append(url_temp)
  return url_lists
def getNBAAllData(url_lists):
  """
  获取所有2017赛季NBA常规赛数据
  """
  datasets = ['']
  for item in url_lists:
    data1 = getNBASingleData(item)
    datasets.extend(data1)
  #去掉数据里的空元素
  for item in datasets[:]:
    if len(item) == 0:
      datasets.remove(item)
  return datasets
def getNBASingleData(url):
  """
  获取1个页面NBA常规赛数据
  """
  # url = 'http://stat-nba.com/query_team.php?QueryType=game&order=1&crtcol=date_out&GameType=season&PageNum=3000&Season0=2016&Season1=2017'
  # html = requests.get(url).text
  html = urllib.urlopen(url).read()
  # print html
  soup = BeautifulSoup(html)
  data = soup.html.body.find('tbody').text
  list_data = data.split('\n')
  # with open('nba_data.txt','a') as fp:
  #   fp.write(data)
  # for item in list_data[:]:
  #   if len(item) == 0:
  #     list_data.remove(item)
  return list_data
def saveDataToExcel(datasets,sheetname,filename):
  book = Workbook()
  sheet = book.add_sheet(sheetname)
  sheet.write(0,0,u'序号')
  sheet.write(0,1,u'球队')
  sheet.write(0,2,u'时间')
  sheet.write(0,3,u'结果')
  sheet.write(0,4,u'主客')
  sheet.write(0,5,u'比赛')
  sheet.write(0,6,u'投篮命中率')
  sheet.write(0,7,u'命中数')
  sheet.write(0,8,u'出手数')
  sheet.write(0,9,u'三分命中率')
  sheet.write(0,10,u'三分命中数')
  sheet.write(0,11,u'三分出手数')
  sheet.write(0,12,u'罚球命中率')
  sheet.write(0,13,u'罚球命中数')
  sheet.write(0,14,u'罚球出手数')
  sheet.write(0,15,u'篮板')
  sheet.write(0,16,u'前场篮板')
  sheet.write(0,17,u'后场篮板')
  sheet.write(0,18,u'助攻')
  sheet.write(0,19,u'抢断')
  sheet.write(0,20,u'盖帽')
  sheet.write(0,21,u'失误')
  sheet.write(0,22,u'犯规')
  sheet.write(0,23,u'得分')
  num = 24
  row_cnt = 0
  data_cnt = 0
  data_len = len(datasets)
  print 'data_len:',data_len
  while(data_cnt< data_len):
    row_cnt += 1
    print '序号:',row_cnt
    for col in range(num):
        # print col
        sheet.write(row_cnt,col,datasets[data_cnt])
        data_cnt += 1
  book.save(filename)
def writeDataToTxt(datasets):
  fp = open('nba_data.txt','w')
  line_cnt = 1
  for i in range(len(datasets)-1):
    #球队名称对齐的操作:如果球队名字过短或者为76人队是 球队名字后面加两个table 否则加1个table
    if line_cnt % 24 == 2 and len(datasets[i]) < 5 or datasets[i] == u'费城76人':
      fp.write(datasets[i]+'\t\t')
    else:
      fp.write(datasets[i]+'\t')
    line_cnt += 1
    if line_cnt % 24 == 1:
      fp.write('\n')
  fp.close()
if __name__ == "__main__":
  pages = int(1132/150)
  url_header = 'http://stat-nba.com/query_team.php?page='
  url_tail = '&QueryType=game&order=1&crtcol=date_out&GameType=season&PageNum=3000&Season0=2016&Season1=2017#label_show_result'
  url_lists = getURLLists(url_header,url_tail,pages)
  datasets = getNBAAllData(url_lists)
  writeDataToTxt(datasets)
  sheetname = 'nba normal data 2016-2017'
  str_time = time.strftime('%Y-%m-%d',time.localtime(time.time()))
  filename = 'nba_normal_data'+str_time+'.xls'
  saveDataToExcel(datasets,sheetname,filename)

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
跟老齐学Python之赋值,简单也不简单
Sep 24 Python
python统计多维数组的行数和列数实例
Jun 23 Python
Python使用ConfigParser模块操作配置文件的方法
Jun 29 Python
python实现flappy bird小游戏
Dec 24 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
Django实现文件上传和下载功能
Oct 06 Python
pandas 对group进行聚合的例子
Dec 27 Python
pycharm 实现本地写代码,服务器运行的操作
Jun 08 Python
Python通过类的组合模拟街道红绿灯
Sep 16 Python
Python特殊属性property原理及使用方法解析
Oct 09 Python
python opencv通过按键采集图片源码
May 20 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 #Python
Python实现合并两个列表的方法分析
May 28 #Python
django js实现部分页面刷新的示例代码
May 28 #Python
Django项目中用JS实现加载子页面并传值的方法
May 28 #Python
Python面向对象类继承和组合实例分析
May 28 #Python
django传值给模板, 再用JS接收并进行操作的实例
May 28 #Python
Django处理文件上传File Uploads的实例
May 28 #Python
You might like
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
python比较两个列表大小的方法
2015/07/11 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
市场营销专业毕业生自荐信
2013/11/02 职场文书
医院总经理职责
2013/12/26 职场文书
客户表扬信范文
2014/01/10 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
公司募捐倡议书
2014/05/14 职场文书
硕士学位论文评语
2014/12/31 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书
宪法宣传标语100条
2019/10/15 职场文书
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
Javascript设计模式之原型模式详细
2021/10/05 Javascript
python小型的音频操作库mp3Play
2022/04/24 Python
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers