一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称
NBA球星蒂姆·邓肯18年职业生涯48分钟场均数据爬取
2.主题式网络爬虫爬取的内容与数据特征分析
蒂姆·邓肯18年生涯巅峰季后赛赛季(得分、篮板、助攻、抢断、盖帽)、总得分以及最强数据
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
1.numpy函数、requests库、re正则获取网页数据
2.BeautifulSoup库解析页面内容
3.padads库将爬取的数据保存为xls形式
4.pandas数据清洗和处理
5.matplotilb库可视化数据绘图
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征
1.主题页面的结构特征
2.Htmls页面解析
import requests from bs4 import BeautifulSoup url = 'http://www.stat-nba.com/player/785.html' def getHTMLText(url,timeout=30): try: r=requests.get(url,timeout=30) r.raise_for_status() r.encoding=r.apparent_encoding return r.text except: return '产生异常' html = getHTMLText(url) soup=BeautifulSoup(html,'html.parser') print(soup.prettify())
3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集
import requests from bs4 import BeautifulSoup import time from xlwt import Workbook def getNBAData(url): res = requests.get(url) res.encoding = 'utf-8' html = res.text soup = BeautifulSoup(html,'lxml') data = soup.html.body.find('tbody').text list_data = data.split('\n') with open('nba_data.txt', 'a',encoding='utf-8') 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, '序号') sheet.write(0, 1, '球员') sheet.write(0, 2, '赛季') sheet.write(0, 3, '球队') sheet.write(0, 4, '出场') sheet.write(0, 5, '时间') sheet.write(0, 6, '投篮') sheet.write(0, 7, '命中') sheet.write(0, 8, '出手') sheet.write(0, 9, '三分') sheet.write(0, 10, '命中') sheet.write(0, 11, '出手') sheet.write(0, 12, '罚球') sheet.write(0, 13, '命中') sheet.write(0, 14, '出手') sheet.write(0, 15, '篮板') sheet.write(0, 16, '前场') sheet.write(0, 17, '后场') sheet.write(0, 18, '助攻') sheet.write(0, 19, '抢断') sheet.write(0, 20, '盖帽') sheet.write(0, 21, '失误') sheet.write(0, 22, '犯规') sheet.write(0, 23, '得分') sheet.write(0, 24, '胜') sheet.write(0, 25, '负') num = 26 row_cnt = 0 data_cnt = 0 data_len = len(datasets) while (data_cnt < data_len): row_cnt += 1 for col in range(num): sheet.write(row_cnt, col, datasets[data_cnt]) data_cnt += 1 book.save(filename) if __name__ == "__main__": url = 'http://www.stat-nba.com/query.php?QueryType=ss&SsType=playoff&Player_id=785&AT=48&Mp0=0' print('开始爬取URL:%s' % url) datasets = getNBAData(url) print('爬取数据完成') sheetname = 'nba normal data' str_time = time.strftime('%Y-%m-%d', time.localtime(time.time())) filename = 'nba_normal_data' + str_time + '.xls' saveDataToExcel(datasets, sheetname, filename) print('数据存储完成')
2.对数据进行清洗和处理
删除无效列(‘命中’和‘出手’)
3.文本分析(可选):jieba分词、wordcloud可视化
4.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)
import pandas as pd import matplotlib.pyplot as plt import numpy as np def main(): # 数据清洗 data.drop('出手',axis=1,inplace=True) #删除无效列出手 data.head()#显示前五行 data.drop('命中',axis=1,inplace=True) #删除无效列命中 data.head()#显示前五行 data.describe() total_points=(data.得分*data.出场).sum()#总得分 avg_points=total_points/data.出场.sum()#平均分 print("邓肯总得分:%s" %round(total_points,1)) print("邓肯平均分:%s" %round(avg_points,1)) max_point=data.得分.max() print(data[data.得分==max_point])#显示最高得分赛季 print(data.loc[data.得分>=30])#显示得分超过30分的赛季 # 最佳数据 max_data={'point':data.得分.max(),'rebounds':data.篮板.max(),'assistants':data.助攻.max(),'steals':data.抢断.max(),'blocks':data.盖帽.max()} best_data=pd.Series(max_data) print(best_data) # 生成折线图 def Brokenline(): plt.figure()#绘制画板 x=np.array([x for x in range(1997,2015)])#x轴为年份 y1=data.得分#y1轴为得分 y2=data.篮板#y2轴为篮板 y3=data.助攻#y3轴为助攻 y4=data.抢断#y4轴为抢断 y5=data.盖帽#y5轴为盖帽 plt.xlabel('season') plt.ylabel('points') plt.plot(x,y1,'red') plt.plot(x,y2,'blue') plt.plot(x,y3,'green') plt.plot(x,y4,'black') plt.plot(x,y5,'yellow') plt.legend() plt.show() # 生成柱状图 def Histogram() x=np.array([x for x in range(1997,2015)]) y=data.助攻 plt.xlabel('season') plt.ylabel('points') plt.bar(x,y,width=0.5,color='m') plt.xticks(x,rotation=30) ax=plt.gca() x_lables=ax.xaxis plt.show() if __name__ == '__main__': # 导入爬取的数据(xls格式) data = pd.read_excel('nba_normal_data2019-12-17.xls') main() #Brokenline() Histogram()
5.数据持久化
6.附完整程序代码
四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
1.经过对主题数据的分析与可视化,可以得到哪些结论?
通过以上的各种可视化数据可以很明显看出蒂姆·邓肯在进入NBA后的数据进步很快,超级巨星的潜力,平均分26分,场均两双数据
2.对本次程序设计任务完成的情况做一个简单的小结。
2.对本次程序设计任务完成的情况做一个简单的小结。
通过这次作业我们能够明白并不是纸上谈兵的,有很多的不懂要靠自己去网上找还有和自己同学交流才能明白,所谓读万卷书行万里路,学习的海洋永无止境,我们只有不断学习才能进步。