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登录豆瓣并发帖的方法
Jul 08 Python
Python list操作用法总结
Nov 10 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
Django跨域请求CSRF的方法示例
Nov 11 Python
Python JSON格式数据的提取和保存的实现
Mar 22 Python
详解如何设置Python环境变量?
May 13 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
django基础学习之send_mail功能
Aug 07 Python
将数据集制作成VOC数据集格式的实例
Feb 17 Python
Python中求对数方法总结
Mar 10 Python
Django 权限管理(permissions)与用户组(group)详解
Nov 30 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 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中strtotime函数使用方法分享
2012/01/10 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
PHP利用Mysql锁解决高并发的方法
2018/09/04 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
js判断日期时间有效性的方法
2015/10/24 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
简单介绍python封装的基本知识
2019/08/10 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
python getpass实现密文实例详解
2019/09/24 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
投标邀请书范文
2014/01/31 职场文书
太太口服液广告词
2014/03/20 职场文书
工作时间证明
2015/06/15 职场文书
PostgreSQL事务回卷实战案例详析
2022/03/25 PostgreSQL
MySQL如何修改字段类型和字段长度
2022/06/10 MySQL