python3 requets+re 批量爬取千千(原百度)音乐

版权声明:大家一起学习,欢迎转载,转载请注明出处。若有问题,欢迎纠正! https://blog.csdn.net/memory_qianxiao/article/details/84401956

以前实验室同学需要文章和音乐,需要用爬虫爬.....要做东西参加比赛,表示好久都没写爬虫了....正如今天的正题,批量爬取千千音乐(原百度音乐)...博主会写下爬取的过程和心得(采坑记录),批量下载的音乐的有效代码虽然才50多行,但是采坑会花费大量时间和精力...

老规矩放几张镇楼图正好博主也正在爬数据.....代码会自动创建在桌面的文件夹,里面包含8种类别的子文件夹(文件夹的种类会随着tag类别列表中个数增加而增加,可以更改,增加或者删除),子文件夹中会保存音乐。

首先进入千千音乐首页,点击千千音乐,然后进入分类:会发现有很多种类的音乐,我们要批量爬取就需要解析每一类的音乐,当然这里面有的类,都可以在tag列表里面添加或者修改。

我们点击安静类别的音乐,发现列出20首音乐在每一页页面上,都在网页中li标签中,每一首歌都有一个独有的song_id

当我们点击页面 那首歌,就会进入播放页面,播放当前音乐,因为服务器有请求音乐的连接,但是被隐藏起来在,所以不得不花费大量时间去找。

由于博主踩过了很多坑,这里我就直接告诉大家音乐的连接怎么找,每一首的音乐资源都会由唯一的song_id,在js里面再次请求,拿到音乐资源的信息,如下图:

 

第一张图上面网址进行请求后会得到,图二的返回歌曲的信息,包括歌曲的源出去,file_link=后面的地址,进行请求的时候,就能下载,会提示下载如下:

所以file_link就是每首歌的地址,当我们直接复制进行请求就能下载了,付费 的歌曲也可以!是不是很神奇,所以找歌曲的源信息到大概讲解到这里就结束了。

接下来就是50多行代码实现的过程:

定义4个函数,分别如下,Get_text()实现网页请求得到页面的信息,返回text类型的数据。get_songId解析每一页20首歌曲的song_id,返回一个列表,传给下载音乐的函数download_music使用,进行音乐下载。dowanload_music就是下载音乐的过程。

def Get_text(url):
def get_songId(html):
def download_music(song_ids,tag):
def main():

接下来,就说下两个函数的要点:main函数里面对每类tag列表中类别进行爬取,然后对多页请求:我们进行多次翻页后对安静类音乐分析:

# http://music.taihe.com/tag/安静 安静第一页
# http://music.taihe.com/tag/安静?start=20&size=20&third_type=0 安静第二页
# http://music.taihe.com/tag/安静?start=40&size=20&third_type=0 安静第三页

可以发现每一类是20首音乐,也就是size=20,第二页:start=20,表示从20开始到请求20首后40结束,第三页:start 40,表示从40开始,请求20首到60结束,所以我们可以发现规律,是第几页就是i*20开始,size为20的请求,i从0开始,由此可以推得第五页是80开始,到100结束。我们下载100首就循环5次,需要很多就循环更多次。

def main():
    #音乐类型
    tags=['安静','美好','轻松','舒服','喜悦','想念','唯美','小清晰']
    ##桌面路径(依据每个人的电脑情况可以更改路径)
    path = "D:\QQPCMgr(1)\Desktop\音乐\\"
    #创建每个音乐种类文件夹分类
    for tag in tags:
        #判断每种类别音乐文件夹是否存在,不存在就创建
        if not os.path.exists(path+tag):
            os.mkdir(path+tag)
    tag_url="http://music.taihe.com/tag/"
    for tag in tags:
        #每页20首,下载5页
        for num in range(5):
            start_url=tag_url+tag+"?start=%s&size=20&third_type=0"%str(num*20)
            #获取每页的信息
            html = Get_text(start_url)
            #h获取每页的每首歌的id
            song_ids=get_songId(html)
            #下载
            download_music(song_ids,tag)
if __name__ == '__main__':
    main()

接下来就下载音乐的函数:我们把每首歌的song_id拿到后,再去动态拼接资源网址:只需要把songid=后面添加拿到的id就行,再次进行请求得到音乐资源的信息。这个网址可以在F12里面进行找,不是固定的,每一首可能有点不一样,但是都可以用,只需要songid就行。

http://musicapi.taihe.com/v1/restserver/ting?method=baidu.ting.song.playAAC&format=jsonp&callback=jQuery172009464779806914603_1542961432060&songid=%s&from=web&_=1542961435466"%song_id

把每个id拿去与上面的网址动态拼接,再请求就是每一首歌的信息,由于返回的是json格式的数据,所以需要需要转换成字典,

需要用json.loads把数据转换成字典,在去取歌曲的信息。需要的是歌名,歌手,歌曲链接,当然还有其他的也可以自己根据需要获取。就贴出源码:有问题可以点击左上角头像,微信向博主提问也可以留言反馈...

# coding=gbk
import requests,re,json,os

def Get_text(url):
    try:
        r=requests.get(url)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        print("请求成功")
        return r.text
    except:
        print("请求失败")

def get_songId(html):
    #正则取出每一页歌曲的songid
    songIds=re.findall(r'<a href="/song/(.*?)".*?',html)
    # print(songIds)
    return songIds
def download_music(song_ids,tag):
    for song_id in song_ids:
        #拼接每一首歌的songid
        url="http://musicapi.taihe.com/v1/restserver/ting?method=baidu.ting.song.playAAC&format=jsonp&callback=jQuery172009464779806914603_1542961432060&songid=%s&from=web&_=1542961435466"%song_id
        #再次请求
        html=Get_text(url)
        try:
            #z正则取出songid
            data=re.findall(r'\((.*?)\)',html)[0]
            #转换成字典
            data=json.loads(data)
        except:
            continue
        print("歌曲地址:"+data['bitrate']['file_link'])
        try:
            print("歌曲:"+data['songinfo']['title'])
            print("歌手:"+data['songinfo']['author'])
        except:
            continue
        author=data['songinfo']['author']
        song_name=data['songinfo']['title']
        url=data['bitrate']['file_link']
        try:
            sorce=requests.get(url)
            print("音乐%s获取成功"%song_name)
        except:
            print("*****音乐%s获取失败****"%song_name)
            continue
        #存储在桌面的文件路径下
        path="D:\QQPCMgr(1)\Desktop\音乐\\"
        name=tag+'/'
        with open(path+name+author+'-'+song_name+'.mp3',"wb") as file:
            try:
                file.write(sorce.content)
                file.close()
                print("##%s下载成功##"%song_name)
            except:
                print("***********%s下载失败*********"%song_name)

def main():
    #音乐类型
    tags=['安静','美好','轻松','舒服','喜悦','想念','唯美','小清晰']
    ##桌面路径(依据每个人的电脑情况可以更改路径)
    path = "D:\QQPCMgr(1)\Desktop\音乐\\"
    #创建每个音乐种类文件夹分类
    for tag in tags:
        #判断每种类别音乐文件夹是否存在,不存在就创建
        if not os.path.exists(path+tag):
            os.mkdir(path+tag)
    tag_url="http://music.taihe.com/tag/"
    for tag in tags:
        #每页20首,下载5页
        for num in range(5):
            start_url=tag_url+tag+"?start=%s&size=20&third_type=0"%str(num*20)
            #获取每页的信息
            html = Get_text(start_url)
            #h获取每页的每首歌的id
            song_ids=get_songId(html)
            #下载
            download_music(song_ids,tag)
if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/memory_qianxiao/article/details/84401956