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使用函数默认值实现函数静态变量的方法
Aug 18 Python
Python语言描述随机梯度下降法
Jan 04 Python
django中的HTML控件及参数传递方法
Mar 20 Python
python 多维切片之冒号和三个点的用法介绍
Apr 19 Python
Python图像处理之颜色的定义与使用分析
Jan 03 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
python版DDOS攻击脚本
Jun 12 Python
Python使用sklearn实现的各种回归算法示例
Jul 04 Python
解决Djang2.0.1中的reverse导入失败的问题
Aug 16 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
python3 使用traceback定位异常实例
Mar 09 Python
设置jupyter中DataFrame的显示限制方式
Apr 12 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 define()函数及defined()函数使用详解
2013/06/09 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
php常用字符函数实例小结
2016/12/29 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
2018/05/24 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
python控制台显示时钟的示例
2014/02/24 Python
在Python程序中进行文件读取和写入操作的教程
2015/04/28 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
使用python3实现操作串口详解
2019/01/01 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
Django Form常用功能及代码示例
2020/10/13 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
马来西亚演唱会订票网站:StubHub马来西亚
2018/10/18 全球购物
纪检干部对照检查材料
2014/08/22 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis