selenium+requests+bs4模块–简单爬虫实例–网易云音乐篇
1、只支持能在网易云音乐平台在线播放的音乐!!!
对于音乐人,我们要支持他们,支持正版版权!!!
2、因为是学习笔记,所以只下载搜到的歌曲列表的第一首音乐,需要下载更多的,可以自行修改一下代码。
3、本文如有侵权,请联系我删除文章!!!
网易云在线播放每首歌曲时,都有一个外链地址,这是不会变的,跟每首歌的唯一一个id绑定在一起,而每首歌audio文件的URL如下:
url = 'http://music.163.com/song/media/outer/url?id=' + 歌曲的id值 + '.mp3'
那么id是什么呢?id应该怎么获取呢?
其实很简单,当你在网易云打开一个音乐时,就能很明显地发现:(本文以《小酒窝》为例)
Q:那怎么获取不同音乐的id呢?
A:换首歌即可呀。
Q:那获取每首歌的这个页面有什么规律可循嘛?
A:当然!
请看:
这是根据歌曲名搜索得到的页面,我们搜几首不同的歌,看看变化。
《小酒窝》
《用心良苦》
《Scarborough Fair》
通过这三个例子,我们就能提取出一个通用的URL模板:
url='https://music.163.com/#/search/m/?s= ' + 歌曲的名字 + ' &type=1'
这样,我们就可以通过一个歌曲的名字获取到一个页面,在这个页面能获取歌曲的ID,然后通过ID和之前的一个URL模板组合起来,就能得到一个全新的URL。
以《小酒窝》为例,得到一个URL:
http://music.163.com/song/media/outer/url?id=26305541.mp3
访问这个URL,出现这个页面,就是我们想要得到的外链
接着对这个页面进行分析
这里面的内容就是我们想要得到的,最终的下载链接!
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(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.0.3987.116Safari / 537.36'
}
#创建文件夹
if not os.path.exists('D:/网易云音乐'):
os.mkdir('D:/网易云音乐')
# 实现无可视化界面(固定写法)
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#获取音乐id
def get_music_ids(url):
# 初始化browser对象
browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
# 访问该url
browser.get(url=url)
# 由于网页中有iframe框架,进行切换
browser.switch_to.frame('g_iframe')
# 等待0.5秒
sleep(0.5)
# 抓取到页面信息
page_text = browser.execute_script("return document.documentElement.outerHTML")
# 退出浏览器
browser.quit()
# 提取音乐的id,名字,歌手名
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]
return music_id
#获取音乐名称
def get_music_names(url):
browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
browser.get(url=url)
browser.switch_to.frame('g_iframe')
sleep(0.5)
page_text = browser.execute_script("return document.documentElement.outerHTML")
browser.quit()
soup = bs4.BeautifulSoup(page_text, 'html.parser')
music_names = soup.select("div[class='td w0'] a b") # 音乐名字
music_name=music_names[0].get("title")
return music_name
#获取歌手名称
def get_music_singers(url):
browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
browser.get(url=url)
browser.switch_to.frame('g_iframe')
sleep(0.5)
page_text = browser.execute_script("return document.documentElement.outerHTML")
browser.quit()
soup = bs4.BeautifulSoup(page_text, 'html.parser')
music_singers = soup.select("div[class='td w1'] a")
music_singer=music_singers[0].string
return music_singer
#下载音乐
def download_music(url,name,singer):
response=requests.get(url=url,headers=headers)
music_data=response.content
music_path_name='{}_{}.mp3'.format(name,singer)
music_path='D:/网易云音乐/'+music_path_name
with open(music_path,'wb') as f:
f.write(music_data)
print(music_path_name,'下载成功')
#主函数
def main():
name = input('请输入歌名:')
url = 'https://music.163.com/#/search/m/?s=' + name + '&type=1'
music_name=get_music_names(url)
musice_singer=get_music_singers(url)
music_id=get_music_ids(url)
music_url= 'http://music.163.com/song/media/outer/url?id=' + music_id + '.mp3'
browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
browser.get(url=music_url)
sleep(0.5)
page_text = browser.execute_script("return document.documentElement.outerHTML")
browser.quit()
soup = bs4.BeautifulSoup(page_text, 'html.parser')
music_source=soup.select("video source")
source_url=music_source[0].get('src')
download_music(source_url,music_name,musice_singer)
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(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.0.3987.116Safari / 537.36'
}
#创建文件夹
if not os.path.exists('D:/网易云音乐'):
os.mkdir('D:/网易云音乐')
# 实现无可视化界面(固定写法)
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#获取音乐id
def get_music_ids(url):
# 初始化browser对象
browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
# 访问该url
browser.get(url=url)
# 由于网页中有iframe框架,进行切换
browser.switch_to.frame('g_iframe')
# 等待0.5秒
sleep(0.5)
# 抓取到页面信息
page_text = browser.execute_script("return document.documentElement.outerHTML")
# 退出浏览器
browser.quit()
# 提取音乐的id,名字,歌手名
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]
return music_id
#获取音乐名称
def get_music_names(url):
browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
browser.get(url=url)
browser.switch_to.frame('g_iframe')
sleep(0.5)
page_text = browser.execute_script("return document.documentElement.outerHTML")
browser.quit()
soup = bs4.BeautifulSoup(page_text, 'html.parser')
music_names = soup.select("div[class='td w0'] a b") # 音乐名字
music_name=music_names[0].get("title")
return music_name
#获取歌手名称
def get_music_singers(url):
browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
browser.get(url=url)
browser.switch_to.frame('g_iframe')
sleep(0.5)
page_text = browser.execute_script("return document.documentElement.outerHTML")
browser.quit()
soup = bs4.BeautifulSoup(page_text, 'html.parser')
music_singers = soup.select("div[class='td w1'] a")
music_singer=music_singers[0].string
return music_singer
#下载音乐
def download_music(url,name,singer):
response=requests.get(url=url,headers=headers)
music_data=response.content
music_path_name='{}_{}.mp3'.format(name,singer)
music_path='D:/网易云音乐/'+music_path_name
with open(music_path,'wb') as f:
f.write(music_data)
print(music_path_name,'下载成功')
#主函数
def main():
name = input('请输入歌名:')
url = 'https://music.163.com/#/search/m/?s=' + name + '&type=1'
music_name=get_music_names(url)
musice_singer=get_music_singers(url)
music_id=get_music_ids(url)
music_url= 'http://music.163.com/song/media/outer/url?id=' + music_id + '.mp3'
browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
browser.get(url=music_url)
sleep(0.5)
page_text = browser.execute_script("return document.documentElement.outerHTML")
browser.quit()
soup = bs4.BeautifulSoup(page_text, 'html.parser')
music_source=soup.select("video source")
source_url=music_source[0].get('src')
download_music(source_url,music_name,musice_singer)
if __name__ =='__main__' :
main()
参考博文1:点击此处获取
参考博文2:点击此处获取
参考B站视频:点击此处获取
参考博文3:点击此处获取
(我是看了这个博主的文章,才有的明确思路)
因为是学习笔记的原因,我并没有准备爬取太多,但仍然存在一点小问题。因为打开音乐外链时,音乐会自动播放,所以使用selenium打开音乐外链,也会有这个问题。因此,在下载音乐的过程中,会听到音乐声。
而以我现在的能力,我能想到的是,使用
browser.find_element_by_xpath('这里填暂停播放按钮的xpath').click()
但是这种方法我没试过,想尝试的小伙伴可以试一下。