最近突然想用python写一个自动下载的工具,于是就先拿网易云来练练手,并把过程中的心得写下来便于后面有想玩这个的童鞋们参考。
首先我们分析网页源码,找到我们想要的获取数据位置:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200827123418365.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUwMDA3NTEx,size_16,color_FFFFFF,t_70#pic_center)
每一个标签对应着飙升榜中的一首歌曲,想要查看歌曲的详细信息,可以点开标签查看。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082712390580.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUwMDA3NTEx,size_16,color_FFFFFF,t_70#pic_center)
点开后,我们发现,关于歌曲时长,歌曲名称,歌曲id,图片,以及作者都可以在两个标签下找到,且想要获取的歌曲名,ID,图片以及作者都是后一个标签的不同属性值,分别对应的是‘data-res-nam’,‘data-res-id’,‘data-res-pic’,'data-res-author’属性的值。
知道我们要获取的数据具体位置后,我们就可以直接写代码来获取了。
在写代码前,我们再仔细看下网页源码,我们发现一个很有意思的现象:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200827124348447.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUwMDA3NTEx,size_16,color_FFFFFF,t_70#pic_center)
我们发现我们要获取的数据,位于一个标签再嵌套的一个标签下面,然后我们发现中间有一个标签节点,其实这相当于是当前界面的子界面,最外层的是父界面,里面的是子界面(可以这么理解),当我们想要用Selenium获取子界面的节点时,是直接获取不到的,需要切换到子界面,然后再去获取才可以。
切换方法很简单,直接用:
driver.switch_to.frame(‘contentFrame’)
其中‘contentFrame’为到name属性的值。
关于获取歌曲名称,作者,时长以及下载图片的方式可以从上面网页源码中直接获取,但是下载歌曲以及歌词时,直接通过API来获取。
获取歌曲:url = “https://music.163.com/song/media/outer/url?id=”+str(id)+".mp3"
获取歌词:url = “http://music.163.com/api/song/lyric?id=”+str(id)+"&lv=1&kv=1&tv=-1"
好了,接下来就可以直接上代码了:
from selenium import webdriver
import pymongo
import requests
import os
import json
'''
实现思路:
1.将网易云音乐'云音乐飙升榜'中的歌曲名,歌手,歌曲时长,图片,歌词获取下来
2.将获取的信息存入本地文档,以"云音乐飙升榜/歌曲名/歌曲名.mp3"的格式存放
3.将获取的信息存入mongo数据库中
'''
class wangyiyun():
def __init__(self, url, headers, num):
self.url = url
self.headers = headers
self.num = num
self.songs_name_list = []
self.songs_times_list = []
self.songs_author_list = []
self.songs_pic_list = []
self.songs_href_list = []
self.songs_id_list = []
self.songs_download_url_list = []
self.songs_info_list = []
def get_songs(self):
downloading_num_time = 1
download_songs_pic = 1
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
self.driver = webdriver.Chrome('./chromedriver',chrome_options=chrome_options)
self.driver.get(self.url)
self.driver.switch_to.frame('contentFrame')
self.songs_times = self.driver.find_elements_by_class_name('u-dur')
for song_time in self.songs_times:
self.songs_times_list.append(song_time.text)
if downloading_num_time < int(self.num):
downloading_num_time += 1
else:
break
self.songs = self.driver.find_elements_by_xpath('//div[@class="j-flag"]/table/tbody//tr/td[3]/div/span[2]')
for song in self.songs:
song_name = song.get_attribute('data-res-name')
self.songs_name_list.append(song_name)
self.songs_author_list.append(song.get_attribute('data-res-author'))
pic_url = song.get_attribute('data-res-pic')
self.songs_pic_list.append(pic_url)
songs_url = 'https://music.163.com/song?id=' + song.get_attribute('data-res-id')
self.songs_href_list.append(songs_url)
songs_id = song.get_attribute('data-res-id')
songs_download_url = 'https://music.163.com/song/media/outer/url?id=' + songs_id + '.mp3'
self.songs_download_url_list.append(songs_download_url)
if not os.path.exists('./云音乐飙升榜/'+ song_name):
os.makedirs('./云音乐飙升榜/'+ song_name)
pic_response = requests.get(pic_url, headers=self.headers)
with open('./云音乐飙升榜/'+ song_name + '/' + song_name+ '.jpg', 'wb') as file_pic:
file_pic.write(pic_response.content)
songs_response = requests.get(songs_download_url, headers=self.headers)
with open('./云音乐飙升榜/'+ song_name + '/' + song_name+ '.mp3', 'wb') as file_song:
file_song.write(songs_response.content)
lrc_url = 'http://music.163.com/api/song/lyric?id='+songs_id+'&lv=1&kv=1&tv=-1'
lrc_response = requests.get(lrc_url, headers=self.headers)
lrc_json = json.loads(lrc_response.text)
with open('./云音乐飙升榜/'+ song_name + '/' + song_name+ '.txt', 'a') as file_lrc:
file_lrc.write(lrc_json['lrc']['lyric'])
if download_songs_pic < int(self.num):
download_songs_pic += 1
else:
print("下载完成!")
break
self.save_info()
self.driver.close()
def save_info(self):
client = pymongo.MongoClient(host='localhost', port=27017)
db = client.wangyiyun
collection = db.music
for i in range(len(self.songs_name_list)):
songs_info = {
'num': i+1,
'name': self.songs_name_list[i],
'time': self.songs_times_list[i],
'author': self.songs_author_list[i],
'pic_href': self.songs_pic_list[i],
'href': self.songs_href_list[i],
'download_rul': self.songs_download_url_list[i]
}
collection.remove({})
self.songs_info_list.append(songs_info)
collection.insert_many(self.songs_info_list)
if __name__ == "__main__":
download_songs_num = input("需要下载歌曲数量: ")
url = 'https://music.163.com/#/discover/toplist'
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'
}
wangyiyun = wangyiyun(url,headers=headers,num=download_songs_num)
wangyiyun.get_songs()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)