爬取网易云部分音乐

用的是python3.x
用到了requests和bs4库
闲来想试一下爬音乐,好了网易云的试一下:
前期知识:
url:https://music.163.com
下载音乐直接用:http://music.163.com/song/media/outer/url?id=这里填歌曲id.mp3
那id从哪来呢,就从网页中分析爬出来,爬出来是一个
"/song?id=447925109"这样的东西,可我指向要id,那怎么办呢,分割吧,字符串分割"/song?id=447925109".split('=')[1]就可以得到id
注意:不能要#号
比如某一歌单链接为:http://music.163.com/#/playlist?id=447925109
我们应该改成:http://music.163.com/playlist?id=447925109
因为加入#,我们发出的http请求会忽略#后面的内容。

这个不能忘,构造user-agent,构造user-agent,构造user-agent
 headers = {
        'User-Agent': 'Mozilla/5.0'
    }

不然解析不出来东西
开始上手:
进入网易云音乐,点击歌单,随便选一个歌单进去,我选了第一个


进去后,是这样的(只截取了部分)

按往常思路,先审查一下元素,看看这些歌在不在里边(肯定能看到,因为我们审查的部分就是浏览器渲染给我们的,巧了,我能看到每首歌,规律就是,他们有不同的id)好了思路是这样,我爬取这个网页获得id,然后通过id去找到歌曲,完美,哎,不行,不能急,我们爬取网页得到的是网页源码,那我再查看网页源代码,完蛋,查id,是0,说明这些音乐的id没有在源码里边,之前的想法行不通,源码里边没有我想要的东西,
那就只能f12开发者工具了解一下咯,打开开发者工具,点击network,刷新一下网易云音乐页面,观察一下情况
我们要找id,那找了半天,在这个下边搜到了我想要的,多复制几个歌曲的id试一下,发现这些id都在这里

既然是这样,那就看看Headers找到请求的url呗
注意看没有,.com后边没有#
得到了这个url后就可以了:
思路是:我通过这个url获得每首歌的id,然后通过‘http://music.163.com/song/media/outer/url?id=‘+d+‘.mp3’,去下载音乐,如果想获得音乐的名字。还有歌手信息怎么办呢,
点一首歌进去看看再说:https://music.163.com/song?id=447925109
,审查一下,诶有,先爬嘛。看看能不能解析出来,那思路又有了,我可以通过构造url:https://music.163.com/#/song?id= id去获得每一首歌的信息,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 main():
    urlls = []
    name_singer_list = []
    url = 'https://music.163.com/playlist?id=2153101541'
    headers = {
        'User-Agent': 'Mozilla/5.0'
    }
    html = getHtml(url,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首音乐下载成功
第7首音乐下载成功
第8首音乐下载成功
第9首音乐下载成功
第10首音乐下载成功
第11首音乐下载成功
第12首音乐下载成功
第13首音乐下载成功
第14首音乐下载成功
第15首音乐下载成功
第16首音乐下载成功
第17首音乐下载成功
第18首音乐下载成功
第19首音乐下载成功
第20首音乐下载成功
第21首音乐下载成功
第22首音乐下载成功
第23首音乐下载失败
第24首音乐下载成功
第25首音乐下载成功
第26首音乐下载成功
第27首音乐下载成功
第28首音乐下载成功
第29首音乐下载成功
第30首音乐下载成功
第31首音乐下载成功
第32首音乐下载成功
第33首音乐下载成功
第34首音乐下载成功
第35首音乐下载成功
第36首音乐下载成功
第37首音乐下载成功
第38首音乐下载成功
第39首音乐下载成功
第40首音乐下载成功
第41首音乐下载成功
第42首音乐下载成功
第43首音乐下载成功
第44首音乐下载成功
第45首音乐下载成功
第46首音乐下载成功
第47首音乐下载成功
第48首音乐下载成功

Process finished with exit code 0

注意:这个过程中遇到的问题,刚开始没有构造user_agent,怎么爬都只能得到一个数据,后来构造了ua然后就很顺利的解析出来了,这个是值得注意的。下边是存下来的mp3文件(只截取了部分)

你可能感兴趣的:(爬取网易云部分音乐)