爬取酷狗近期热搜的歌曲

一、主题式网络爬虫设计方案

1.主题式网络爬虫名称:酷狗热搜歌曲

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

内容:主要是爬取酷狗音乐热搜歌曲名和作者

数据特征分析:对酷狗TOP500上歌曲的时长做一个可视化表格

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

实现思路:用requests库抓取页面信息,用BeautifulSoup库解析网页,创建excel存储数据进行数据分析

技术难点:excel的创建和相关系数散点图与建立回归方程

二、主题页面的结构特征分析

1.主题页面的结构与特征分析

在浏览器中输入酷狗音乐官方网址https://www.kugou.com/,打开主页,然后点击榜单找到榜单页面,如图所示

 

 

三、网络爬虫程序设计

1.数据爬取与采集

爬取代码如下import requests
import time
import xlwt
from bs4 import BeautifulSoup
#创建Excel存储数据
class Spider:
    def __init__(self):
        self.workbook, self.worksheet = self.create_excel()
        self.nums = 1
    def create_excel(self):
        workbook = xlwt.Workbook(encoding='utf-8')
        worksheet = workbook.add_sheet('Sheet1')
        title = ['排名', '歌手和歌名', '播放时间']
        for index, title_data in enumerate(title):
            worksheet.write(0, index, title_data)
        return workbook, worksheet
    def get_html(self,url):
       
        headers={'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)',}  # 爬虫请求头信息
        response = requests.get(url, headers=headers)
        if response.status_code == 200:  # 如果请求状态值为200,则输出
            return response.text
        else:
            return '产生异常'
    def get_data(self,html):
        soup = BeautifulSoup(html, 'lxml')  # 用BeautifulSuop库解析网页
        ranks = soup.find_all('span', class_='pc_temp_num')  # 排名
        names = soup.find_all('a', class_='pc_temp_songname')  # 歌名和歌手
        times = soup.find_all('span', class_='pc_temp_time')  # 播放时间
        # 打印信息
        for r, n, t in zip(ranks, names, times):  # 用zip函数
            r = r.get_text().replace('\n', '').replace('\t', '').replace('\r', '')
            n = n.get_text()
            t = t.get_text().replace('\n', '').replace('\t', '').replace('\r', '')
            data = {'排名': r, '歌名-歌手': n, '播放时间': t}
            self.worksheet.write(self.nums, 0, str(r))
            self.worksheet.write(self.nums, 1, str(n))
            self.worksheet.write(self.nums, 2, str(t))
            self.nums += 1
    def main(self,):
        urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i)) for i in range(1, 24)]  # 用for循环
        for url in urls:
            print(url)
            html = self.get_html(url)
            self.get_data(html)
            time.sleep(1)
            self.workbook.save('data.xls')#存入所有信息后保存为data.xls
if __name__ == '__main__':  # 程序执行时调用主程序main()
     spider = Spider()
     spider.main()

 

 

 

 

接下来进行数据清洗与处理

  #数据清洗
print('\n====各列是否有缺失值情况如下:====')
print(df.isnull())
#统计空值情况
print(df.duplicated())
#查找重复值
print(df.isna().head())
#统计缺失值  # 得出结果为False则不为空值   
print(df.describe())
#描述数据

 

 完整代码如下:

import requests
import time
import xlwt
from bs4 import BeautifulSoup
#创建Excel存储数据
class Spider:
    def __init__(self):
        self.workbook, self.worksheet = self.create_excel()
        self.nums = 1
    def create_excel(self):
        workbook = xlwt.Workbook(encoding='utf-8')
        worksheet = workbook.add_sheet('Sheet1')
        title = ['排名', '歌手和歌名', '播放时间']
        for index, title_data in enumerate(title):
            worksheet.write(0, index, title_data)
        return workbook, worksheet
    def get_html(self,url):
       
        headers={'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)',}  # 爬虫请求头信息
        response = requests.get(url, headers=headers)
        if response.status_code == 200:  # 如果请求状态值为200,则输出
            return response.text
        else:
            return '产生异常'
    def get_data(self,html):
        soup = BeautifulSoup(html, 'lxml')  # 用BeautifulSuop库解析网页
        ranks = soup.find_all('span', class_='pc_temp_num')  # 排名
        names = soup.find_all('a', class_='pc_temp_songname')  # 歌名和歌手
        times = soup.find_all('span', class_='pc_temp_time')  # 播放时间
        # 打印信息
        for r, n, t in zip(ranks, names, times):  # 用zip函数
            r = r.get_text().replace('\n', '').replace('\t', '').replace('\r', '')
            n = n.get_text()
            t = t.get_text().replace('\n', '').replace('\t', '').replace('\r', '')
            data = {'排名': r, '歌名-歌手': n, '播放时间': t}
            self.worksheet.write(self.nums, 0, str(r))
            self.worksheet.write(self.nums, 1, str(n))
            self.worksheet.write(self.nums, 2, str(t))
            self.nums += 1
    def main(self,):
        urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i)) for i in range(1, 24)]  # 用for循环
        for url in urls:
            print(url)
            html = self.get_html(url)
            self.get_data(html)
            time.sleep(1)
            self.workbook.save('data.xls')#存入所有信息后保存为data.xls
if __name__ == '__main__':  # 程序执行时调用主程序main()
     spider = Spider()
     spider.main()

#数据清洗
print('\n====各列是否有缺失值情况如下:====')
print(df.isnull())
#统计空值情况

print(df.duplicated())

查找重复值
print(df.isna().head())
#统计缺失值  # 得出结果为False则不为空值   
print(df.describe())
10 #描述数据

 

posted @ 2020-04-19 15:27  基拉哇啦  阅读(456)  评论(0)    收藏  举报