爬取网易云音乐更新-增加爬取多个歌单

之前爬取的只是一个歌单里边的歌曲,现在增加爬取多个歌单的功能,通过一次次点击歌单的分析,网易云对歌单也是通过一个id值来确定的,最开始的地址(点击歌单后):url=https://music.163.com/discover/playlist,注意:#号不能要。进去歌单后,页面是这样的

通过Network查找,发现第一页每个歌单的id是在一个Name叫playlist里边,再通过每个歌单的id在里边搜了一下,发现在每个id会在这么3个地方
那我该选哪一个来解析呢?
注意看一下我们的歌单url,是这样的:
url = https://music.163.com/playlist?id=2264645756
分析一下,可以发现,我们找到每个歌单是通过id的,也就是说我们要的就是id,用来构造访问每个歌单的url:"https://music.163.com/#/playlist?id=歌单的id",再结合解析,我用的bs4,那毫无疑问,我肯定选择第三个来解析,我可以直接解析出红框中的内容,然后用"https://music.163.com+我得到的内容"来构造歌单url
此处的解析代码:

def getplayList(html):  #解析出歌单的id和歌单名字
    playlists = []
    soup = BeautifulSoup(html, 'html.parser')
    id = soup.select('.dec a')
    for i in id:
        playlist = []
        playlist.append(i['href'])  #获得歌单的[/playlist?id=2264645756]
        playlist.append(i['title']) #获得歌单的名字
        playlists.append(playlist) #把每一个歌单的名字和id放到列表中
    return playlists

playlists是这样的一个形式(只选了部分),但其中的歌单名我并没有用,因为我没想好怎么用它

[['/playlist?id=2264645756', '想 一 个 人 在 黄 昏 后'], ['/playlist?id=2355333774', '你不是我的诗\xa0正如我不是你的梦'], ['/playlist?id=363692915', '「 Indie 」 那天午后打了个盹儿'], ['/playlist?id=2347578332', '西音东渐:日式西洋古典美学'], ['/playlist?id=2331853291', '爱是紫色的折叠梦境,曼妙又绮丽'], ['/playlist?id=2349865512', '【情话说唱】我的歌里写的是你'], ['/playlist?id=2353471182', '攒了一大堆好听的歌想和你一起听'], ['/playlist?id=2352321741', 'Bass Institute|Bass House'], ['/playlist?id=2298138241', '听了几个故事,正好讲给你玩'], ['/playlist?id=2311431519', '你的名字我的心事〈情歌说唱〉'], ['/playlist?id=2299157419', '活的像风 没有归宿 却也够酷'], ['/playlist?id=2302705693', '『古风』我自问酒不问仙 半世逍遥半世癫']] 

这样就能得出歌单的id了,就可以构造出歌单的url了,如下(只贴出了实现本功能的代码):

 playurl = 'https://music.163.com/discover/playlist'#歌单页面的url(第一页)
    headers = {
        'User-Agent': 'Mozilla/5.0'
    }
    playhtml = getHtml(playurl,headers=headers)#获得歌单页面
    playidlist = getplayList(playhtml)  #解析出id、每个歌单名字
    for u in playidlist:  #构造每个歌单url,用于下载歌单中的音乐
        start_url_list.append('https://music.163.com'+u[0])

start_url_list的结构内容是这样的:

['https://music.163.com/playlist?id=2264645756', 'https://music.163.com/playlist?id=2355333774', 'https://music.163.com/playlist?id=363692915', 'https://music.163.com/playlist?id=2347578332', 'https://music.163.com/playlist?id=2331853291', 'https://music.163.com/playlist?id=2349865512', 'https://music.163.com/playlist?id=2353471182', 'https://music.163.com/playlist?id=2352321741', 'https://music.163.com/playlist?id=2298138241', 'https://music.163.com/playlist?id=2311431519', 'https://music.163.com/playlist?id=2299157419', 'https://music.163.com/playlist?id=2302705693', 'https://music.163.com/playlist?id=2300523945', 'https://music.163.com/playlist?id=2301094981', 'https://music.163.com/playlist?id=2301267346', 'https://music.163.com/playlist?id=2297457355', 'https://music.163.com/playlist?id=2290267281', 'https://music.163.com/playlist?id=2291115145', 'https://music.163.com/playlist?id=2301310816', 'https://music.163.com/playlist?id=2290797610', 'https://music.163.com/playlist?id=2286380125', 'https://music.163.com/playlist?id=2283281232', 'https://music.163.com/playlist?id=2278767768', 'https://music.163.com/playlist?id=2277307819', 'https://music.163.com/playlist?id=2343741251', 'https://music.163.com/playlist?id=2274985772', 'https://music.163.com/playlist?id=2335662972', 'https://music.163.com/playlist?id=2274346473', 'https://music.163.com/playlist?id=2336165805', 'https://music.163.com/playlist?id=2274803562', 'https://music.163.com/playlist?id=2339316534', 'https://music.163.com/playlist?id=2272295927', 'https://music.163.com/playlist?id=2336073422', 'https://music.163.com/playlist?id=2286925070', 'https://music.163.com/playlist?id=2341435171']
Process finished with exit code 0

也就是说每个项就是一个歌单的url,那接下来就是通过每个歌单的url去爬取歌单里边的音乐了,当然,得结合之前的去歌单解析出每首歌的id值,接下来的步骤就和第一篇文章的步骤一样了爬取网易云部分音乐
完整代码:

import requests
from bs4 import BeautifulSoup

def getHtml(url,headers):
    try:
        r = requests.get(url,headers = headers)
        r.raise_for_status()
        r.encoding = 'utf-8'
        return r.text
    except:
        print('爬取失败')
        return ''

def htmlParser(html):
    try:
        id_list = []
        soup = BeautifulSoup(html,'html.parser')
        li = soup.select('.f-hide li a')
        for i in li:
            id_list.append(i['href'].split('=')[-1])
        return id_list
    except:
        print('获得id出错')
        return ''

def get_name_singer(html):
    name_sig_list = []
    soup = BeautifulSoup(html,'html.parser')
    name = soup.select('.f-ff2')
    singer = soup.select('p.des.s-fc4 span a')
    name_sig_list.append(name[0].text)
    name_sig_list.append(singer[0].text)
    return name_sig_list
def getMusic(lst,nslst):

        urls = []
        for id in lst:
            urls.append('http://music.163.com/song/media/outer/url?id='+id+'.mp3')
        for i in range(len(urls)):
            try:
                r = requests.get(urls[i])
                with open('music/'+nslst[i][1].strip()+','+nslst[i][0].strip()+'.mp3','wb') as f:
                    f.write(r.content)
                    print('第{}首音乐下载成功'.format(i+1))
            except :
                print('第{}首音乐下载失败'.format(i+1))
        f.close()
def getplayList(html):
    playlists = []
    soup = BeautifulSoup(html, 'html.parser')
    id = soup.select('.dec a')
    for i in id:
        playlist = []
        playlist.append(i['href'])
        playlist.append(i['title'])
        playlists.append(playlist)
    return playlists
def main():
    urlls = []
    name_singer_list = []
    start_url_list = []
    # start_url = 'https://music.163.com/playlist?id=2153101541'
    playurl = 'https://music.163.com/discover/playlist'#歌单页面的url(第一页)
    headers = {
        'User-Agent': 'Mozilla/5.0'
    }
    playhtml = getHtml(playurl,headers=headers)#获得歌单页面
    playidlist = getplayList(playhtml)  #解析出id、每个歌单名字
    for u in playidlist:  #构造每个歌单url,用于下载歌单中的音乐
        start_url_list.append('https://music.163.com'+u[0])
    print(start_url_list)
    for url in start_url_list:
        html = getHtml(url,headers=headers)
        idlist = htmlParser(html)
        for id in idlist:
            urlls.append('https://music.163.com/song?id='+id)
        for url in urlls:
            html = getHtml(url,headers)
            name_singer_list.append(get_name_singer(html))
        # print(name_singer_list)
        getMusic(idlist,name_singer_list)
main()

运行结果:

F:\New_Anaconda\python.exe E:/Spider_Folder/网易云音乐下载.py
第1首音乐下载成功
第2首音乐下载成功
第3首音乐下载成功
第4首音乐下载成功
第5首音乐下载成功
第6首音乐下载成功

Process finished with exit code -1

碍于用的是流量,还有网速感人,只是下载了一点。保存的截图:

介于没有运行完整,可能会后边有什么错误,慢慢改吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容