python爬取网易云音乐歌曲

十二 2022年04月17日 1646 0

前言

爬虫玩得好,牢饭吃到饱🙊

最近在车上听歌,因为是15年买的蒙丢丢,所以车上没有carplay,每次听歌都要用手机连接蓝牙,播放我的网易云歌单

于是想到了python的爬虫

正文

话不多说 直接上代码

import requests
import re
from multiprocessing import Pool
import urllib

headers = {
    'Referer': 'https://music.163.com/',
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 "
                  "Safari/537.36",
    'cookie': 'nts_mail_user=david678l@163.com:-1:1; _ntes_nuid=6493652fd68741a4b4a3d9392c2674f2; '
              '_ntes_nnid=6493652fd68741a4b4a3d9392c2674f2,1636202369614; NMTID=00O-DMXXMcgRmgK90-NqBX9-WatsbYAAAF89ULQWA;'
              ' WEVNSM=1.0.0; WNMCID=bcevqp.1636202370150.01.0; WM_TID=LaB3hhqMllJBFQAEFBJvtesyNAziW0pE; '
              'NTES_P_UTID=Ibl3gFnSJM1Y3qeDUolgP7dxpC1OGuVP|1637233397; '
              'P_INFO=david678l@163.com|1637233397|0|mail163|00&99|shd&1636960822&mail163#shd&370200#10#0#0|156699&0|mail163|david678l@163.com; '
              'WM_NIKE=9ca17ae2e6ffcda170e2e6eed5f23eb1a7fb88ea6988928fa2d85f838f9faaaa80f8899ca2f9638e8a87d6b62af0fea7c3b92aad949e89ea4abab68e91cc648baaa684c47b81b186a4ce4d94e7a183d24fb494859ab64d93958c85bb49abe786bbef6fb4b99b86ec5a8cb6ae8ced5db2eefab8d3458796ff90b4458facb783c13c9c8ca782f25ead9ff8a6fc6687879786e13f8bb7e1b4d545f8e7a4d1b26d8fad88d2e753bcedb6b7dc3cbab5a5b2b77faa8eada9c437e2a3; WM_NI=oLRhkBzjBpIhIvjcAqCoJCOGP9obSEpLKy7GQKDd8Ci9JZlepgUeiRHjbknWr26WPOEJ1o1OMtybB0XTiasVoA8EynEYYeb5Ii%2FSVO49l03gMsH1dYx3zVY0zkkQ4ujRcHA%3D; __snaker__id=4aFk2xSkFzKRRJDk; gdxidpyhxdE=g3JWbrIOf5WWPCAX%5CvODGIVGh6LCZ5Y7an866welQYlSe9iKA6Y2POE0i0%2BiT%2BAQ50JAoDYlOqBKPk8z1ItM8aUtJL%2BNtXWbcPB0wcxS5L4vQKfKo9ed2ERYsGOuNdPbYaUApVIKx%2BzQYpnED0GjgxRsMwMOqwyii5NJ%5CG7iN3EK8PgQ%3A1638685762617; _9755xjdesxxd_=32; __csrf=c267b86313db92cb18ccc80ed35b8568; __remember_me=true; MUSIC_U=cf84c04d5a9e2f5d9896666c61f6cd57f42458285b4abab3ae6b86426490ce38519e07624a9f0053d78b6050a17a35e705925a4e6992f61dfe3f0151024f9e31; ntes_kaola_ad=1; playerid=16194281; JSESSIONID-WYYY=zHD05zXyOSrixwhzw%2B8ZVMFsgYAKi57%5CGMSkxmzwYDT3D6BIk8r2%5CxU0HfNWBW5Zw0%2FNHYvWhr5SetC68Qbx4NUqIzeid5ae%5CEBzCwA5Zo7xCYyy%2FGjc%2B%2FeKo6DxPJBjAGdNxRUYjU5T7578%2FiGIw%5Cflfm99%5CUlb0GA1kzjZkdjkKT1j%3A1638706651436; _iuqxldmzr_=33'
}


# def get_page(url):
#     res = requests.get(url, headers=headers)
#     data = re.findall('<a title="(.*?)" href="/playlist\?id=(\d+)" class="msk"></a>', res.text)
#     print(data)
#
#     pool = Pool(processes=4)
#     pool.map(get_songs, data[:len(data) - 1])
#     print("下载完毕!")


def get_songs():
    print("开始获取")
    playlist_url = "https://music.163.com/playlist?id=2883145616"
    res = requests.get(playlist_url, headers=headers)
    for i in re.findall(r'<a href="/song\?id=(\d+)">(.*?)</a>', res.text):

        try:
            print(i)
            print("Downing--" + i[1])
            ID = i[0]
            url = 'https://music.163.com/song/media/outer/url?id='
            req = requests.get(url + ID, headers=headers, allow_redirects=False)
            musicLink = req.headers['Location']
            urllib.request.urlretrieve(musicLink, 'H:/' + i[1] + '.mp3')
            print("Dend Downing + " + i[1])



        except FileNotFoundError:
            pass
        except OSError:
            pass


if __name__ == '__main__':
    # hot_url = "https://music.163.com/discover/playlist/?order=hot"
    # hot_url = 'https://music.163.com/discover/playlist/?order=hot&cat=全部&limit=35&offset=' + str(35)
    # get_page(hot_url)
    get_songs()

下面 我们来解释一下各个块的含义

import

引入python库,相信这一步 大家应该都很了解。要使用网络请求的话 就必须要引入requests库。

headers

网络请求的头部。

我们请求所有的网站时,都会携带一些信息,比如cookie

image-20220417212906556

其实爬虫本身的含义就是模拟用户去访问这个网站获得数据,这样我们在写爬虫的时候 就需要用到用户的cookie和请求头。

def

def在python中为定义一个函数,这个函数类似于可封装的程序片断,与java中的用public void 方法() 和 js中的function 方法(){} 是相同的意思。

定义一个url https://music.163.com/playlist?id=2883145616

image-20220417214016662

访问这个url后 发现返回后的页面内 有单个歌曲的id,我们这时候通过re.findall(r'<a href="/song\?id=(\d+)">(.*?)</a>', res.text)来获取单曲的id。

我们已知,网易云音乐外链的地址为https://music.163.com/song/media/outer/url?id=*****,这样我们就可以通过写一个for循环,来循环获取这个歌单内的id,再通过字符串拼接的方式将id拼接到下载链接内,后面的事情 就可以交给程序啦,指定一个下载地址,就可以右键运行了。

image-20220417214631613

目前网易云进行了限制 在网页上面查看歌单只能查看前20首 完整歌单需要在手机上才能查看,后期我会再研究一下,有动手能力的小伙伴也可以自行研究喔~
快快搞起来吧!🚩

Last Updated: 2022/04/17 21:50:17
spring最常用的7种注解 Typora将图片上传到七牛云服务器上