前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫实例七:网易云音乐

爬虫实例七:网易云音乐

原创
作者头像
远方的星
修改2021-03-01 18:13:35
3.9K2
修改2021-03-01 18:13:35
举报

一、前言

本文爬取内容均为网易云提供免费下载的音乐。

二、下载链接分析

网易云在线播放每首歌曲时,都有一个外链地址,这是不会变的,跟每首歌的唯一一个id绑定在一起,而每首歌audio文件的URL如下:

代码语言:python
复制
url = 'http://music.163.com/song/media/outer/url?id=' + 歌曲的id值 + '.mp3'

那么id是什么呢?id应该怎么获取呢?

其实很简单,当你在网易云打开一个音乐时,就能很明显地发现:(本文以《小酒窝》为例)

Q:那怎么获取不同音乐的id呢?

A:换首歌即可呀。

Q:那获取每首歌的这个页面有什么规律可循嘛?

A:当然!

请看:

这是根据歌曲名搜索得到的页面,我们搜几首不同的歌,看看变化。

《小酒窝》

《用心良苦》

《Scarborough Fair》

通过这三个例子,我们就能提取出一个通用的URL模板:

代码语言:python
复制
url='https://music.163.com/#/search/m/?s= ' + 歌曲的名字 + ' &type=1'

这样,我们就可以通过一个歌曲的名字获取到一个页面,在这个页面能获取歌曲的ID,然后通过ID和之前的一个URL模板组合起来,就能得到一个全新的URL。

以《小酒窝》为例,得到一个URL:

代码语言:python
复制
http://music.163.com/song/media/outer/url?id=26305541.mp3

访问这个URL,出现这个页面,就是我们想要得到的外链

接着对这个页面进行分析

这里面的内容就是我们想要得到的,最终的下载链接!

三、完整代码

代码语言:python
复制
import requests
import os
import bs4
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.options import Options

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER'
}
# 创建保存音乐的文件夹
path = os.path.join('D:/网易云音乐')
if not os.path.exists(path):
    os.mkdir(path)
# 输入音乐名
name = input('请输入歌名:')
# 实现无可视化界面(固定写法)
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 初始化browser对象
browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)


# 获取音乐的id、名字,歌手名
def get_id_name_singer(url):
    browser.get(url=url)
    browser.switch_to.frame('g_iframe')
    sleep(0.5)
    page_text = browser.execute_script("return document.documentElement.outerHTML")
    soup = bs4.BeautifulSoup(page_text, 'html.parser')
    music_ids = soup.select("div[class='td w0'] a")  # 音乐id
    music_id = music_ids[0].get("href")
    music_id = music_id.split('=')[-1]
    music_names = soup.select("div[class='td w0'] a b")  # 音乐名字
    music_name = music_names[0].get("title")
    music_singers = soup.select("div[class='td w1'] a")  # 歌手名
    music_singer = music_singers[0].string
    return music_id, music_name, music_singer


# 下载音乐
def download_music(url, song_name, singer):
    response = requests.get(url=url, headers=headers)
    music_data = response.content
    music_path_name = '{}_{}.mp3'.format(song_name, singer)
    music_path = path + music_path_name
    with open(music_path, 'wb') as f:
        f.write(music_data)
        print(music_path_name, '下载成功')


# 主函数
def main():
    url = 'https://music.163.com/#/search/m/?s=' + name + '&type=1'
    music_id, music_name, music_singer = get_id_name_singer(url)
    music_url = 'http://music.163.com/song/media/outer/url?id=' + music_id + '.mp3'
    download_music(music_url, music_name, music_singer)


if __name__ == '__main__':
    main()
    browser.quit()

四、声明

作者:远方的星

CSDN:https://blog.csdn.net/qq_44921056

腾讯云 : https://cloud.tencent.com/developer/column/91164

本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、下载链接分析
  • 三、完整代码
  • 四、声明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档