python爬取酷狗Top500排行榜

2018-08-14 15:40:05 / 打印

新的一周开始了,今天无意间听到一首比较好听的歌曲“学猫叫”,然后就开始了无限循环模式。本以为是新出的歌曲,故怀着激动的心情推荐给朋友,谁知朋友直接告诉我这首歌已经在酷狗top500排行榜高居榜首很久了。听到这个,不得不感慨,我是有多久没有了解酷狗的歌曲信息了。因此怀着好奇的心情去看了一下最新的酷狗top500排行,发现这首歌曲仍高居榜首,另外排行榜中也出现了很多我没有听说过的歌曲,真的打击到我了。对我这个喜欢听音乐的人来说,竟然对当下比较流行的一些歌曲竟然缺乏了基本认识。在这种耻辱心理的作用下,小编就想着统计一下最近的酷狗top500排行榜的歌曲信息,因此本期文章小编就和大家分享一下怎么使用python去爬取酷狗top500排行榜的歌曲信息,娱乐之余随时掌握点知识。下面正式开始。

本期文章主要将爬取酷狗top500排行榜的歌曲信息,具体来说就是获取排行榜中各首歌的排名、歌曲名称、歌手以及播放时间方面的信息,大家先来看一下基本的情况:

说到爬虫,它不过是人工浏览网页的自动化实现,因此爬虫必备两件事情:

模拟计算机对服务器发起Request请求;

接受服务器端的Response内容并解析、提取自己需要的信息。

因此任意一次爬虫,必须要做的都是发出请求获得网页,解析网页内容根据网页标签获得你所需要的信息。根据你需要浏览的网页的类型,爬虫不可避免地分为多页面爬虫和跨页面爬虫(常常浏览网页的你应该对此再熟悉不过,就不再多做解释)。多页面的爬虫基本流程为:

手动翻页并观察各网页的URL构成特点,构造出所有页面的URL并存入列表中;

根据URL列表依次循环取出各个URL;

定义爬虫函数;

循环调用爬虫函数,获得网页信息并存储数据;

循环完毕,结束爬虫。

而跨页面的爬虫流程表现为:

定义爬虫函数爬取列表页所有专题的URL;

将种子URL存放入列表之中;

定义爬取种子URL页面的爬虫函数;

爬取各个种子URL页面下的相关信息;5.存放数据,结束循环。

所以可以看出相对于多页面爬虫,跨页面爬虫仅仅是需要多定义一个爬虫函数,两种爬虫流程的基本内容都是观察网页,定义爬虫函数而后爬取存储,所以了解一点网页知识是很有必要的。

小编一直使用的都是Chrome浏览器(也就是谷歌浏览器),所以小编就以Chrome页面为例来进行说明,如果你没有安装这种浏览器也不用紧张,因为大多浏览器的页面构造都是相同的。不过小编还是推荐你能够使用谷歌浏览器,因为真的很快捷方便功能强,还有就是没有广告(这点我很欣赏)。任意打开一个网页,这里就以酷狗的官网为例吧(),在地址栏输入网址,然后任意移到网页的某处右键选择检查命令,便可以得到如下网页代码:

小编这里使用的是python进行爬虫,虽然python中已经自带了一些网页获取与解析工具,但是相对于某些第三方库,自带的库效率较低。因此这里小编就着重介绍两种在网络爬虫中最常用的第三方库requests和BeautifulSoup。

Requests库的官方文档指出:让http服务人类。因此顾名思义,requests就是用来获取网页的;而BeautifulSoup库是用来解析网页的,通过这个库可以将网页代码格式化显示从而便于观察网页获取网页信息。两个库的安装,仅需要在命令行中输入以下代码即可。

pip install requestspip install BeautifulSoup不过如果你安装的是Anaconda的话,那么这两个库默认是已经安装好了的,所以小编这里再一次建议诸位安装Anaconda。好了,既然准备工作已经完成,那么下面正式开始爬虫实战。

Top500排行榜所在的网页地址为-8888.html?from=rank,这是排行榜的第一页,共有24首歌曲信息,这样的页面应该有24页,第二页页面地址为http://www.kugou.com/yy/rank/home/2-8888.html?from=rank,所以你应该已经观察出特点了,每页唯一的不同点就是8888前面的数字,这个数字就是页面页码,所以如果要依次获得各页面的网址,你应该可以通过下面这种方式便捷地获得。

urls = ['{}-8888.html?from=rank'.format(ii) for ii in range(1,25)]这里小编以第一页的“学猫叫”这首歌的歌曲信息获取来说明爬取过程,第一页的网址已经知道,所以需要通过requests库获得网页内容。

吧:有道翻译的休闲

import requestsurl = "-8888.html?from=rank"hearder = {User-Agent: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/xxxxxxxxx Safari/537.36'} # xxxx内容为小编谷歌浏览器的相关私秘,这里请使用你自己的res = requests.get(url,header= header)res.textrequests获取网页内容这就是requests获得网页内容的部分截图,现在知道为何要使用另外的解析库去解析网页内容了吧,这么混乱的网页构造估计能折腾死人,下面就使用BeautifulSoup来重新解析网页。from bs4 import BeautifulSoupbsobj = BeautifulSoup(res.text,'lxml')bsobjBeautiSoup解析网页这就是BeautiSoup的魅力所在,网页内容一下子整洁格式化了,非常便于你去查找各个内容,既然已经正确地解析了网页,那么下面自然就是需要获得需要的内容了。ranks = bsobj.select('#rankWrap > div.pc_temp_songlist > ul > li:nth-of-type(1) > span.pc_temp_num > strong')titles = bsobj.select('#rankWrap > div.pc_temp_songlist > ul > li:nth-of-type(1) > a')play_times = bsobj.select('#rankWrap > div.pc_temp_songlist > ul > li:nth-of-type(1) > span.pc_temp_tips_r > span')for rank,title,play_time in zip(ranks,titles,play_times):    rank = rank.get_text().strip()    music = title.get_text().split('-')[1]    singer = title.get_text().split('-')[0]    play_time = play_time.get_text().strip()print(rank,music,singer,play_time)输出内容代码中的第一行用来获取歌曲的排名信息,bsobj.select()函数中的参数为歌曲排名信息在网页中的相应存储位置,这个可以通过将鼠标移至排名的地方右键检查命令,然后在弹出的网页内容中通过右键的copy selector命令获取,不过切记将其中的nth-child改成nth-of-type;代码中的第二行以及第三行分别获取歌曲的标题以及播放时间;for循环用来获取其中的每一个所需要素,这里不再过多讲解,因为相关的命令在之前的文章中小编已经有所提及,所以这里不存在陌生命令。最后的print()函数将内容输出,可以从图中看出,我们已经正确地爬取了内容,那么下一步自然是需要将爬取的内容存放起来方便后续使用,这就需要用到小编在前期所讲到的xlwings库了,这个库可以连通python和Excel,极大方便python对Excel的定向输出。关于它的使用,请参看小编的前期文章,这里不再赘述。至此,大致已经了解了怎么去爬取网页中的相关内容,那么下面就要正式开始爬取排行榜的所有信息了。综合示例# _*_ coding:utf-8 _*_"""    @Author: liupu    @filename: top500_music    @date: 2018-8-13    # Description:        # usege: 爬取酷狗音乐Top500排行榜,并将其存放进excel文件中        # 平台:Windows7 + Python3.6 + ipython/visual studio code        # 基本库需求:requests,Beautifulsoup,xlwings"""# 导入相关的库import requestsfrom bs4 import BeautifulSoupimport xlwings as xw import time# 创建一个excel文件,便于后面存放歌曲信息wb = xw.Book()sht = wb.sheets[0]sht.range('A1').value = [['排名','歌曲名称','歌手','播放时间']]     # 设置标题行# 定义爬虫函数def get_info(url):    header = {    User-Agent: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/xxxxxxxxx     Safari/537.36'    }  # 再次提醒,请改成自己的,否则请在下面的函数中不要使用header参数。    res = requests.get(url,header = header)    bsobj = BeautifulSoup(res.text,'lxml')    ranks = bsobj.select(        '#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_num')    titles = bsobj.select(        '#rankWrap > div.pc_temp_songlist > ul > li > a')    play_times = bsobj.select(        '#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_tips_r > span')        # 获取所需要的四种内容信息    for rank,title,play_time in zip(ranks,titles,play_times):        rank = int(rank.get_text().strip())        music = title.get_text().split('-')[1]        singer = title.get_text().split('-')[0]        play_time = play_time.get_text().strip()        # 将爬取的内容存入Excel之中        sht.range((rank+1,1)).value = rank        sht.range((rank+1,2)).value = music        sht.range((rank+1,3)).value = singer        sht.range((rank+1,4)).value = play_time# 爬取各页面的信息if __name__ == '__main__':    urls = ['http://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(ii)) for ii in range(1,25)]  # 创建url列表    for url in urls:        get_info(url)  # 循环爬取各页面        time.sleep(2)  # 设置一个间断时间,从而避免被反爬    wb.save('top_500.xlsx')  # 保存Excel文件    wb.close()       # 关闭Excel爬虫结果后记本文讲到这里就暂告一段落了,本期文章和大家聊了使用python去爬取酷狗Top500排行榜的歌曲信息,了解了在python爬虫中最为常用的requests库和BeautifulSoup库的相关使用方法。本文的爬虫属于典型的多页面爬虫,这种类型的爬虫在生活与工作中非常常见,所以请大家能够熟练这种爬虫流程。后续文章小编也会加大这些的介绍,同时也会对跨页面爬虫进行介绍,敬请期待。最后再次感谢你们的支持与鼓励,你们的陪伴是小编前进的动力!