利用selenium+BS4+python对某狗音乐排行榜进行歌曲的爬取

利用selenium+BS4+python对某狗音乐排行榜进行歌曲的爬取

这个爬虫是在学习商业智能实训课程时留的作业,现在搬出来给大家分享。
爬取的链接为https://www.kugou.com/yy/rank/home/page1-8888.html(酷狗音乐排行)
先来看看网页结构:
酷狗音乐排行榜第一页
我们首先要知道我们的目的是什么,当然是获取歌曲的下载直链。然后就要开始构思我们的爬虫结构:
一、爬取歌曲排行榜的每一页的歌曲详情页链接+歌曲信息
二、根据每一个歌曲的详情页链接对歌曲的下载直链进行获取
三、通过下载直链对歌曲进行批量下载
那我们就开始构思爬虫第一步:

爬取歌曲排行榜的每一页的歌曲详情页链接+歌曲信息

在观察了网页结构以后,发现可以用bs4对网页进行解析,这个网页无任何反爬措施。
上程序:

def SongInformation(page):
	#调用函数传进来爬取页数
    urls='https://www.kugou.com/yy/rank/home/'+page+'-8888.html'
    re=requests.get(url=urls,headers=headers)
    #save=re.content.decode('utf-8')
    save=re.text
    if save!=None:
    	#利用bs4进行网页解析
        soup=bs(save,'html.parser')
        #利用select组合查询器进行位置查询
        rank=soup.select('span.pc_temp_num')#歌曲排名
        musichref=soup.select('div.pc_temp_songlist>ul>li>a')#歌曲详情页链接
        mhref=[]#歌曲链接
        list=[]# 歌曲信息综合
        singer = []#歌手名字
        songname = []#歌曲名字
        for i in musichref:
            mhref.append(i['href'])#添加歌曲链接
            list.append(i['title'].split(' - ',2))#添加歌曲作者以及歌曲名字
        for i in list:
            songname.append(i[1])#添加歌曲名字
            singer.append(i[0])#添加歌手信息
        for i,j,k in zip(mhref,songname,singer):
            song_infor = {
                'url':i,
                'name':j,
                'singer':k
            }#压缩为song_infor字典对象
            song_list_info.append(song_infor)#将song_infor字典存进数列
    else:
        pass

在这一步过后,我们成功的获取到了歌曲的详情页链接,那么我们就要进行第二步:

根据每一个歌曲的详情页链接对歌曲的下载直链进行获取

先展示歌曲详情页网页效果(以《对爱的渴望》歌曲为例):
在这里插入图片描述

在这里我们可以看到歌曲的下载直链在一个叫做audio标签下边,此时出现了问题,通过bs4对网页进行解析,获取到的内容无audio。说明网站采取了部分反扒措施,那么我们则要通过selenium对网页信息进行获取,selenium的安装我就不在此阐述,详细教程直接百度即可。
废话不多说直接上代码:

def down(url):
	#传进来歌曲详情页的下载链接
    option = webdriver.ChromeOptions()
    #option.add_argument("headless")为selenium进行浏览器模拟时,不打开页面只在后台进行。
    option.add_argument("headless")
    #加载selenium
    browser = webdriver.Chrome('E:\python\Scripts\chromedriver.exe', chrome_options=option)
    #对网页进行解析
    browser.get(url)
    response=browser.page_source
    #查找id为myAudio的标签
    audiutl=browser.find_element_by_id('myAudio')
    #硬核休息2s,防止被banIP
    time.sleep(2)
    #提取audiutl中的src属性值,并将其返回
    print('*****************'+audiutl.get_property('src'))
    return audiutl.get_property('src')
    #browser.close()#关闭浏览器其他应用

这一步结束我们就获取到了我们的歌曲下载直链,接下来我们就可以对歌曲进行下载保存了。

通过下载直链对歌曲进行储存

这一步还是比较简单的,直接上代码:

def KuGouDownload(startpage,endpage):
    for i in range(startpage,endpage):
        try:
            print('正在存储第'+str(i+1)+'页歌曲信息')
            #储存歌曲信息,对应第一步
            SongInformation(str(i+1))
            print('第'+str(i+1)+'页歌曲信息存储成功')
            time.sleep(1)
        except:
            print('第'+str(i+1)+'页歌曲信息存储失败,已跳过当前页')
    for i in song_list_info:
        print(i['name'] + '下载地址:')
        #获取下载直链,对应第二步
        z=down(i['url'])
        #通过下载直链将歌曲存储到本地
        with open("D:\KugouSpider\下载音乐\{}.mp3".format(i["name"]), 'wb') as f:
            mp3 = requests.get(z, headers=headers).content
            f.write(mp3)
            print('歌曲已下载完毕')

这一步结束我们就完成了对酷狗音乐排行榜的歌曲爬取,下面展示运行过程效果图以及运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整代码:

注意!!!!!要写一个公用请求头!!!!

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup as bs
import  requests
from selenium import webdriver
import time
# #此项目为爬取酷狗排行榜并批量下载的python项目
def down(url):
    option = webdriver.ChromeOptions()
    option.add_argument("headless")
    browser = webdriver.Chrome('E:\python\Scripts\chromedriver.exe', chrome_options=option)
    browser.get(url)#仍以阿衣莫为例
    response=browser.page_source
    audiutl=browser.find_element_by_id('myAudio')
    time.sleep(2)
    print('*****************'+audiutl.get_property('src'))
    return audiutl.get_property('src')

    #browser.close()#关闭浏览器其他应用
#*****************************************************************************************************************************************
#此方法为爬取歌曲信息:
song_list_info=[]#存放全部歌曲列表
song_download_url=[]#经过筛选处理后得到的真正的歌曲下载链接
headers={
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36'
}#公用请求头
def SongInformation(page):
    urls='https://www.kugou.com/yy/rank/home/'+page+'-8888.html'

    re=requests.get(url=urls,headers=headers)
    #save=re.content.decode('utf-8')
    save=re.text
    if save!=None:
        soup=bs(save,'html.parser')
        rank=soup.select('span.pc_temp_num')#歌曲排名
        musichref=soup.select('div.pc_temp_songlist>ul>li>a')
        mhref=[]#歌曲链接
        list=[]# 歌曲信息综合
        singer = []#歌手名字
        songname = []#歌曲名字
        for i in musichref:
            mhref.append(i['href'])#添加歌曲链接
            list.append(i['title'].split(' - ',2))#添加歌曲作者以及歌曲名字
        for i in list:
            songname.append(i[1])
            singer.append(i[0])
        for i,j,k in zip(mhref,songname,singer):
            song_infor = {
                'url':i,
                'name':j,
                'singer':k
            }
            song_list_info.append(song_infor)
    else:
        pass
#*****************************************************************************************************************************************
def KuGouDownload(startpage,endpage):
    for i in range(startpage,endpage):
        try:
            print('正在存储第'+str(i+1)+'页歌曲信息')
            SongInformation(str(i+1))
            print('第'+str(i+1)+'页歌曲信息存储成功')
            time.sleep(1)
        except:
            print('第'+str(i+1)+'页歌曲信息存储失败,已跳过当前页')
    for i in song_list_info:
        print(i['name'] + '下载地址:')
        z=down(i['url'])
        #print('************'+z)
        #z=song_download_url.append(down(i['url']))
        with open("D:\KugouSpider\下载音乐\{}.mp3".format(i["name"]), 'wb') as f:
            mp3 = requests.get(z, headers=headers).content
            f.write(mp3)
            print('歌曲已下载完毕')
#********************************************************************************************************************************************
def main():
    try:
        a=input('请输入下载开始页数(默认为从第一页开始下载):')
        if a==''or a=='1':
            a=0
        else:
            a=int(a)
        b=input('请输入下载结束页数(最大为23):')
        b=int(b)
        #if b>23
        print("您想要下载第"+str(a)+'至第'+str(b)+'页')
        print('即将开始下载,请勿关机或者停止程序!')
        KuGouDownload(a,b)
        print('音乐已下载完毕,祝君开心。')
    except:
        print('您输入的信息有误,请重新运行此程序。')
if __name__ == '__main__':
    main()

工程文件点击此处下载,本人本着分享代码的原则,禁止商用!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪萌萌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值