一、创作背景

这学期的大作业是要根据这学期的学习内容做一个综合程序,这次是一个爬取酷狗音乐飙升榜单的信息,并下载下来。可以方便和我一样喜欢白嫖的人员免费下载音乐。

二、使用的库

主要使用了requests库、BeautifulSoup库用于爬取信息,pandas库用于将信息写入txt文件中,pyplot库和WordCloud库用于绘制词云。

requests库---Requests库是一个Python的第三方库,可以通过调用来帮助我们实现自动爬取HTML网页页面以及模拟人类访问服务器自动提交网络请求。Requests库只有一个核心方法,即request方法。而其余六个方法则是通过调用request方法来实现各种各样的操作。通过封装调用request方法,加之添加其他代码,减少编程人员的代码编写量。

获取HTML网页的主要方法

  • url:欲获取网页的网址链接url
  • params:可选参数,选择字典或者字节流格式
  • **kwargs:12个控制访问的参数

调用requests.get(),会构造一个向服务器请求资源的request对象,然后返回一个包含服务器资源的response对象。

BeautifulSoup库---BeautifulSoup是一个可以从HTMLXML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.BeautifulSoup会帮你节省数小时甚至数天的工作时间。

将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄.

from bs4 import BeautifulSoup
soup = BeautifulSoup(open("index.html"))
soup = BeautifulSoup("data")

首先,文档被转换成Unicode,并且HTML的实例都被转换成Unicode编码

BeautifulSoup("Sacré bleu!")
Sacré bleu!

然后,Beautiful Soup选择最合适的解析器来解析这段文档,如果手动指定解析器那么Beautiful Soup会选择指定的解析器来解析文档。

pandas库---pandas含有使数据分析工作变得更快更简单的高级数据结构和操作工具。pandas是基于NumPy构建的,让以NumPy为中心的应用变得更加简单。pandas有两个主要的数据结构:Series 和 DataFrame。虽然它们并不能解决所有问题,但它们为大多数人提供了一种可靠的、易于使用的基础。在这里使用DataFrame进行数据保存,将爬取的数据保存到txt文件中。

pyplot库---matplotlib 是 Python 下著名的绘图库,matplotlib 通过 pyplot 模块提供了一套类似和 Matlab 类似的画图 API,将众多绘图对象所构成的复杂结构隐藏在这套 API 内部。只需调用 pyplot 模块所提供的函数就可快速绘图以及设置图表的各种细节。
matplotlib.pyplot 的引用方式:import matplot.pyplot as plt
pyplot 模块重命名为 plt,有助于提高代码的可读性,plt 代替 matplotlib.pyplot。

WordClude库---wordcloud库把词云当作一个WordCloud对象wordcloud.WordCloud()代表一个文本对应的词云,可以根据文本中词语出现的频率等参数绘制词云词云的绘制形状、尺寸和颜色都可以设定

三、设计概要

  1. 算法介绍
def func1(url):
  dic = {}
  for i in range(1,24):
      html = requests.get(url,headers=headers)
      soup = BeautifulSoup(html.text,'lxml')
      titles = soup.select('.pc_temp_songname')
      href = soup.select('.pc_temp_songname')
      times = soup.select('.pc_temp_time')
      data_all = []
      for titles, times, href in zip(titles, times, href):
          data = {
              '歌曲名称': titles.get_text().replace('\n', '').replace('\t', '').replace('\r', '').split('-')[0],
              '歌手': titles.get_text().replace('\n', '').replace('\t', '').replace('\r', '').split('-')[1],
              '歌曲时长': times.get_text().strip().replace('\n', '').replace('\t', '').replace('\r', ''),
              '歌曲链接': href.get('href')}
          print(data)
          cnt_songer(data['歌手'], dic)
          data_all.append(data)
          data_frame(data_all)
      time.sleep(2)
      return dic

例化一个BeautifulSoup对象,并且将网页源码数据加载到该对象中,获取音乐名称、音乐时间以及音乐链接。使用循环将获取的名称、时间、链接通过zip()压缩到data中。返回一个包含上述信息的字典dic。

def word_cloud(items):  # 可视化之词云
    color_mask = imageio.imread("kugou.jpg")
    wc = WordCloud(
        background_color="white",  # 设置背景颜色
        mask=color_mask,  # 设置背景图片
        max_words=400,  #
        width=600,
        height=800,
        # stopwords = "", #设置停用词
        font_path="./simfang.ttf",
        # 设置中文字体,使得词云可以显示(词云默认字体是“DroidSansMono.ttf字体库”,不支持中文),不加这个的话显示口型乱码
        max_font_size=50,  # 设置字体最大值
        min_font_size=10,
        random_state=30,  # 设置有多少种配色方案
        margin=2,
    )
    wc.generate_from_frequencies(items)
    plt.figure(1)
    plt.imshow(wc)
    plt.axis('off')
    plt.show()
    wc.to_file("酷狗TOP500词云.png")

使用matplotlib绘制词云。Color_mask为词云的背景图片,在WordCloud()中设置其他的属性如词云的长宽高、字体颜色等。使用wc.generate_from_frequencies(items)为词云中内容。

四、部分功能介绍

 1.获取歌曲信息

def func1(url):
  dic = {}
  for i in range(1,24):
      html = requests.get(url,headers=headers)
      soup = BeautifulSoup(html.text,'lxml')
      titles = soup.select('.pc_temp_songname')
      href = soup.select('.pc_temp_songname')
      times = soup.select('.pc_temp_time')
      data_all = []
      for titles, times, href in zip(titles, times, href):
          data = {
              '歌曲名称': titles.get_text().replace('\n', '').replace('\t', '').replace('\r', '').split('-')[0],
              '歌手': titles.get_text().replace('\n', '').replace('\t', '').replace('\r', '').split('-')[1],
              '歌曲时长': times.get_text().strip().replace('\n', '').replace('\t', '').replace('\r', ''),
              '歌曲链接': href.get('href')}
          print(data)
          cnt_songer(data['歌手'], dic)
          data_all.append(data)
          data_frame(data_all)
      time.sleep(2)
      return dic

此部分是通过BeautifulSoup例化一个BeautifulSoup对象,并且将网页源码数据加载到该对象中,获取音乐名称、音乐时间以及音乐链接。获取歌曲信息,并用循环保存到字典中,最后返回dic字典。字典中包含歌曲名称、歌手、歌曲时间长短以及歌曲链接使用循环将获取的名称、时间、链接。

 2.歌曲下载

def func2(url):
    response = requests.get(url=url, headers=headers)
    response.encode = response.apparent_encoding
    hashs = re.findall('"Hash":"(.*?)"', response.text, re.S)
    album_ids = re.findall('"album_id":(.*?),"', response.text, re.S)
    FileNames = re.findall('"FileName":"(.*?)"', response.text, re.S)
    data = zip(hashs, album_ids, FileNames)
    for i in data:
        hash = i[0]
        album_ids = i[1]
        FileName = i[2].encode('utf-8').decode('unicode_escape')
        #print(hash, album_ids, FileName)
        download_url = 'https://wwwapi.kugou.com/yy/index.php'
        params = {
            'r': 'play/getdata',
            'callback': 'jQuery19107150201841602037_1602314563329',
            'hash': '{}'.format(hash),
            'album_id': '{}'.format(album_ids),
            'dfid': '3ve7aQ2XyGmN0yE3uv3WcaHs',
            'mid': 'ac3836df72c523f46a85d8a5fd90fe59',
            'platid': '4',
            '_': '1602312793005',
        }
        print('.....正在下载  '+FileName)
        download(download_url,FileName)
        print('.....下载完成')

这里使用request库,对目标网址进行解析获取Hash、album_id、FileName三个信息并将其压缩到data中。使用循环将data中的数据调入download函数进行下载歌曲。

python爬取酷狗音乐代码 python爬取音乐网站排行榜_python爬取酷狗音乐代码

python爬取酷狗音乐代码 python爬取音乐网站排行榜_python_02

index.php指的是浏览器开发者模式下从network中获取的php文件中的信息。从php的data中可获取歌曲的hash值和album_id值,用于之后的下载。其中play_url可以之间打开一个网页用于播放音乐,可在这个界面下保存歌曲。

五、完整的代码

因版权原因,不能出现全部代码

六、运行结果

python爬取酷狗音乐代码 python爬取音乐网站排行榜_词云_03

python爬取酷狗音乐代码 python爬取音乐网站排行榜_python爬取酷狗音乐代码_04

七、总结

酷狗音乐榜单爬虫是用于爬取酷狗音乐飙升榜单,具有绘制词云、爬取信息并保存到txt文件中、下载歌曲的功能

这里主要使用了requests库、BeautifulSoup库用于爬取信息,pandas库用于将信息写入txt文件中,pyplot库和WordCloud库用于绘制词云。