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实现对PPT文件进行截图操作的方法
Apr 28 Python
在Python中操作时间之strptime()方法的使用
Dec 30 Python
Python多进程并发(multiprocessing)用法实例详解
Jun 02 Python
python中利用队列asyncio.Queue进行通讯详解
Sep 10 Python
PYTHON基础-时间日期处理小结
May 05 Python
Django实现全文检索的方法(支持中文)
May 14 Python
对python3 一组数值的归一化处理方法详解
Jul 11 Python
解决python 无法加载downsample模型的问题
Oct 25 Python
Django框架实现的简单分页功能示例
Dec 04 Python
python列表推导式入门学习解析
Dec 02 Python
如何对python的字典进行排序
Jun 19 Python
Python如何测试stdout输出
Aug 10 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 如何向 MySQL 发送数据
2006/10/09 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
jquery中:input和input的区别分析
2011/07/13 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
海蓝之谜(LA MER)澳大利亚官方商城:全球高端奢华护肤品牌
2017/10/27 全球购物
PHP经典面试题
2016/09/03 面试题
敬老院活动总结
2014/04/28 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
公务员培的训心得体会
2014/09/01 职场文书
争先创优心得体会
2014/09/12 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
怎样写离婚协议书
2015/01/26 职场文书
工艺技术员岗位职责
2015/02/04 职场文书
上下班时间调整通知
2015/04/23 职场文书
九年级化学教学反思
2016/02/22 职场文书
Django如何与Ajax交互
2021/04/29 Python
Windows11性能真的上涨35%? 桌面酷睿i9实测结果公开
2021/11/21 数码科技
 python中的元类metaclass详情
2022/05/30 Python