利用python获取网易云音乐的歌曲,原理+代码!简单易懂

关于爬取网易云音乐的歌曲,有一些思路。代码在末尾哦

一般来说,爬取音乐,采取正则表达式或者直接调用API,这里采用API

首先导入需要用到的库

from lxml import etree
import requests
import json
from concurrent.futures import ThreadPoolExecutor

然后我们要知道,要爬取音乐就要先获取到API接口,但是我没有找到官方发布的API,

但是找到了网易云音乐的搜索接口,该接口的 URL 是:

search_url = f'https://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={keyword}&type=1&offset=0&total=true&limit=5'

原理:使用了 requests 库发送 HTTP 请求,通过访问网易云音乐的搜索接口(https://music.163.com/api/search/get/web)来获取搜索结果的 JSON 数据。然后,使用 json 模块解析 json 数据,提取所需的歌曲信息

既然明白了原理,那接下来就好办了

# 创建一个线程池
pool = ThreadPoolExecutor(max_workers=10)
# 构造下载链接
url = f'http://music.163.com/song/media/outer/url?id={id}'
# 发送下载请求
response = requests.get(url=url, headers=headers).content
# 将响应内容写入文件
with open(name+'.mp3', 'wb') as f:
    f.write(response)
# 打印下载完成消息
print(name, '下载完成')
# 发送请求获取页面内容
response = requests.get(url=url, headers=headers).text
# 使用XPath解析页面
page_html = etree.HTML(response)
# 解析歌曲列表信息,并逐个提交下载任务到线程池
for i in json.loads(id_list):
    name = i['name']
    id = i['id']
    author = i['artists'][0]['name']
    pool.submit(download, id, name+'-'+author)

 #最后关闭线程池

pool.shutdown()

好了,核心部分已经解决了,接下来稍微完善一下代码结构,就得到了完整的代码:

from lxml import etree
import requests
import json
from concurrent.futures import ThreadPoolExecutor

# 创建线程池
pool = ThreadPoolExecutor(max_workers=10)
# 请求头信息
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"
}
def download(id, name):
    # 构造下载链接
    url = f'http://music.163.com/song/media/outer/url?id={id}'
    # 发送下载请求
    response = requests.get(url=url, headers=headers).content
    # 将响应内容写入文件
    with open(name+'.mp3', 'wb') as f:
        f.write(response)
    # 打印下载完成消息
    print(name, '下载完成')
def get_id(url):
    # 发送请求获取页面内容
    response = requests.get(url=url, headers=headers).text
    # 使用XPath解析页面
    page_html = etree.HTML(response)
    # 提取歌曲列表信息
    id_list = page_html.xpath('//textarea[@id="song-list-pre-data"]/text()')[0]
    # 解析歌曲列表信息,并逐个提交下载任务到线程池
    for i in json.loads(id_list):
        name = i['name']
        id = i['id']
        author = i['artists'][0]['name']
        pool.submit(download, id, name+'-'+author)
    # 关闭线程池
    pool.shutdown()
if __name__ == '__main__':
    # 用户输入歌曲关键词
    keyword = input("请输入歌曲名称:")
    # 构造搜索URL
    search_url = f'https://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={keyword}&type=1&offset=0&total=true&limit=5'
    # 发送搜索请求并获取响应内容
    response = requests.get(url=search_url, headers=headers).json()
    # 提取歌曲列表
    song_list = response['result']['songs']
    # 遍历歌曲列表,逐个提交下载任务到线程池
    for song in song_list:
        name = song['name']
        id = song['id']
        author = song['artists'][0]['name']
        pool.submit(download, id, name+'-'+author)
    # 关闭线程池
    pool.shutdown()

来看效果,输入想要搜索的歌曲,然后自动进行下载。

利用python获取网易云音乐的歌曲,原理+代码!简单易懂_第1张图片

 好啦,以上就是全部的内容了,如果有帮到你的话,点个赞吧!

你可能感兴趣的:(Python,python,网络爬虫)