Python高级应用程序设计任务要求,,一、主题式网络爬虫设


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

1.主题式网络爬虫名称

网易云歌曲排行榜歌曲时长


2.主题式网络爬虫爬取的内容与数据特征分析

主要是爬取网易云里面的歌名,歌手和歌曲时长。

对网易云歌曲的时长做一个可视化表格。

3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)

实现思路:利用requests的get方法访问网站。

用xpath方法解析网页原码。

技术难点:需要下载最新版本的谷歌,还需要安装谷歌的驱动否则运行不出来。

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

技术图片


2.Htmls页面解析

技术图片


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

根据F12中的数据查找到相应位置并requests.get(),再利用正则找到正确的数据并保存起来

三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集

爬取的代码如下:

from lxml import etreefrom selenium import webdriverimport pandas as pdclass WangyiMusic():    # 请求的地址 云音乐飙升榜    url = "https://music.163.com/#/discover/toplist?id=19723756"    def __init__(self):        #选择浏览器驱动 chromedriver.exe        self.browser = webdriver.Chrome(executable_path="D:\python\chromedriver.exe")        if self.get_HTML():            self.parse_HTML()    #由于页面的歌曲信息都存放在页面的ifram里面,所以采用Selenium进入子页面获得源码    def get_HTML(self):        #使用get方法访问网站        self.browser.get(self.url)        self.browser.switch_to_frame(‘contentFrame‘)        iframe = self.browser.page_source        return iframe        #用xpath方法解析网页原码    def parse_HTML(self):        iframe = self.get_HTML()        html = etree.HTML(iframe)        try:            #获取排名            num = html.xpath(‘//td/div/span[@class = "num"]/text()‘)            #获取歌名            song = html.xpath(‘//td//div/span[@class="txt"]/a/b/@title‘)            #获取歌手            singer = html.xpath(‘//td/div[@class = "text"]/@title‘)            #获取歌曲时长            time = html.xpath(‘//td[@class = " s-fc3"]/span[@class = "u-dur "]/text()‘)                        #DataFrame列名            columns_list = [‘歌名‘,‘歌手‘,‘时长‘]            #将歌名、歌手和时长用zip函数转换成一个列表数据类型            data = list(zip(song,singer,time))            #用排名做行索引            index_list = num            #转换成DataFram数据            dataFrame = pd.DataFrame(data,index = index_list,columns = columns_list)            #避免多次运行爬取,将数据存入csv文件中,做后续的数据分析            dataFrame.to_csv(".wangyiMusic.csv")            return dataFrame        except Exception as e:            print(‘解析失败!‘,e.args)object = WangyiMusic()print(object.parse_HTML())

运行结果如下:

技术图片

2.对数据进行清洗和处理

#输出网易云数据文件的前5行data=pd.DataFrame(pd.read_csv(‘./wangyiMusic.csv‘))data.head()

技术图片

#删除无效列data.drop(1,axis=0,inplace=True)data.head()

技术图片

#查找重复值data.duplicated()

技术图片

#删除重复值data=data.drop_duplicates()data.head()

技术图片

#空值处理data[‘歌名‘].isnull().value_counts()

技术图片

#异常值处理data.describe()

技术图片

3.文本分析(可选):jieba分词、wordcloud可视化


4.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)

技术图片

技术图片

技术图片

技术图片

技术图片

5.数据持久化

技术图片


6.附完整程序代码

from lxml import etreefrom selenium import webdriverimport pandas as pdclass WangyiMusic():    # 请求的地址 云音乐飙升榜    url = "https://music.163.com/#/discover/toplist?id=19723756"    def __init__(self):        #选择浏览器驱动 chromedriver.exe        self.browser = webdriver.Chrome(executable_path="D:\python\chromedriver.exe")        if self.get_HTML():            self.parse_HTML()    #由于页面的歌曲信息都存放在页面的ifram里面,所以采用Selenium进入子页面获得源码    def get_HTML(self):        #使用get方法访问网站        self.browser.get(self.url)        self.browser.switch_to_frame(‘contentFrame‘)        iframe = self.browser.page_source        return iframe        #用xpath方法解析网页原码    def parse_HTML(self):        iframe = self.get_HTML()        html = etree.HTML(iframe)        try:            #获取排名            num = html.xpath(‘//td/div/span[@class = "num"]/text()‘)            #获取歌名            song = html.xpath(‘//td//div/span[@class="txt"]/a/b/@title‘)            #获取歌手            singer = html.xpath(‘//td/div[@class = "text"]/@title‘)            #获取歌曲时长            time = html.xpath(‘//td[@class = " s-fc3"]/span[@class = "u-dur "]/text()‘)                        #DataFrame列名            columns_list = [‘歌名‘,‘歌手‘,‘时长‘]            #将歌名、歌手和时长用zip函数转换成一个列表数据类型            data = list(zip(song,singer,time))            #用排名做行索引            index_list = num            #转换成DataFram数据            dataFrame = pd.DataFrame(data,index = index_list,columns = columns_list)            #避免多次运行爬取,将数据存入csv文件中,做后续的数据分析            dataFrame.to_csv(".wangyiMusic.csv")            return dataFrame        except Exception as e:            print(‘解析失败!‘,e.args)object = WangyiMusic()print(object.parse_HTML())

  

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

结论:

大部分的歌曲时长都集中在3-4分钟之间。

隔壁老樊,小鬼和华晨宇等歌手比较受听众喜爱。

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

由于自己知识的缺乏在进行实操出现各种各样的错误,不断翻阅书籍才补缺补漏将代码写好。这次的作业让我python更进一步的了解也更加深了我的知识,是一次很好的学习过程。

Python高级应用程序设计任务要求

评论关闭