Python实现一个面向主题的网络爬虫程序,并完成以下内容:
(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台)

一、主题式网络爬虫设计方案(15分)

1.主题式网络爬虫名称

NBA球员拉塞尔-威斯布鲁克生涯表现
2.主题式网络爬虫爬取的内容与数据特征分析

NBA球员拉塞尔-威斯布鲁克生涯信息进行爬取分析
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)

获取NBA球员拉塞尔-威斯布鲁克生涯信息,提取其中的赛况数据与比分累计。设计方案主要靠requests库结合beautifulsoup进行数据解析。技术难点主要是怎么对获取的信息做可视图分析。

技术路线:requests beautifulsoup

二、主题页面的结构特征分析(15分)
1.主题页面的结构特征

https://nba.hupu.com/players/russellwestbrook-3016.html
2.Htmls页面解析

 

 

3. 节点(标签)查找方法与遍历方法
(必要时画出节点树结构)

 

利用find标签进行查找

三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集
2.对数据进行清洗和处理
3.文本分析(可选):jieba分词、wordcloud可视化
4.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)

程序代码:

 

# -*- coding: utf-8 -*-
import requests
import pandas as pd
import matplotlib.pyplot as plt
from bs4 import BeautifulSoup

list = [] #数据数组

def getWeb(url):
    #获取网页数据
    try:
        r = requests.get(url)
        r.raise_for_status()
        return r.text
    except:
        return "响应失败"
        
        
def getdata(html):
    #初始化
    soup = BeautifulSoup(html, "html.parser")
    #选择器
    table = soup.select("table.players_table.bott.bgs_table > tbody > tr.color_font1.borders_btm")
    #循环取出每组数据
    for tables in table:
        datas = tables.get_text().split('\n')
        #去掉数据里的空元素
        for i in datas:
            if len(i) == 0:
                datas.remove(i)
        #加入数据组
        list.append(datas)
    #保存数据
    fo = open("russellwestbrook.txt", "w+")
    #循环取出每组数据

    for datas in list:
        #内循环单数据
        for i in datas:
            fo.writelines(i + " ")
            print(i)
        #大循环换行
        fo.writelines("\n")
    fo.close()
def table(html):
    #设置空列表保存数据
    list=[]
    soup = BeautifulSoup(html, "html.parser")
    #寻找球员各对手战队数据的助攻数,并添加进列表
    for i in soup.find_all('tr' ,class_='color_font1 borders_btm'):
        j=i.select('td')[11].text
        list.append(j)
    #将前六个对手战队的助攻数作为整型返回
    results = ([int(x) for x in list[2:8]])
    #设置图表绘制模式
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['font.family'] = 'sans-serif'
    #绘制图表
    s=pd.Series([results[0],results[1],results[2],results[3],results[4],results[5]],['马刺','魔术','骑士','国王','太阳','猛龙'])
    s.plot(kind='bar',title='助攻数量')
    plt.show()
if __name__=='__main__':
    html = getWeb("https://nba.hupu.com/players/russellwestbrook-3016.html")
    getdata(html)
    table(html)

 

运行结果:

 

  1. 数据爬取与采集
    # -*- coding: utf-8 -*-
    import requests
    import pandas as pd
    import matplotlib.pyplot as plt
    from bs4 import BeautifulSoup
    
    list = [] #数据数组
    
    def getWeb(url):
        #获取网页数据
        try:
            r = requests.get(url)
            r.raise_for_status()
            return r.text
        except:
            return "响应失败"
            
            
    def getdata(html):
        #初始化
        soup = BeautifulSoup(html, "html.parser")
        #选择器
        table = soup.select("table.players_table.bott.bgs_table > tbody > tr.color_font1.borders_btm")
        #循环取出每组数据
        for tables in table:
            datas = tables.get_text().split('\n')
            #去掉数据里的空元素
            for i in datas:
                if len(i) == 0:
                    datas.remove(i)
            #加入数据组
            list.append(datas)
  2. 数据取出与保存
    #保存数据
        fo = open("russellwestbrook.txt", "w+")
        #循环取出每组数据
    
        for datas in list:
            #内循环单数据
            for i in datas:
                fo.writelines(i + " ")
                print(i)
            #大循环换行
            fo.writelines("\n")
        fo.close()
    def table(html):
        #设置空列表保存数据
        list=[]
        soup = BeautifulSoup(html, "html.parser")
        #寻找球员各对手战队数据的助攻数,并添加进列表
        for i in soup.find_all('tr' ,class_='color_font1 borders_btm'):
            j=i.select('td')[11].text
            list.append(j)
        #将前六个对手战队的助攻数作为整型返回
    results = ([int(x) for x in list[2:8]])
  3. 数据可视化
    #设置图表绘制模式
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.rcParams['font.family'] = 'sans-serif'
        #绘制图表
        s=pd.Series([results[0],results[1],results[2],results[3],results[4],results[5]],['马刺','魔术','骑士','国王','太阳','猛龙'])
        s.plot(kind='bar',title='助攻数量')
        plt.show()
    if __name__=='__main__':
        html = getWeb("https://nba.hupu.com/players/russellwestbrook-3016.html")
        getdata(html)
    table(html)
    

      

    1. 经过对主题数据的分析与可视化,可以得到哪些结论?

    易看出助攻的数量在猛龙与太阳队最多,在马刺队最少。

    1. 对本次程序设计任务完成的情况做一个简单的小结。

    由于自己对于requests库的不熟练,无法把爬虫做到面面俱到,经过这次任务加深了我对python爬虫的认识也加深了我对爬虫学习的兴趣。

     

 

 

posted on 2019-12-21 19:33  凯风快晴。  阅读(180)  评论(0编辑  收藏  举报