最近突然想用python写一个自动下载的工具,于是就先拿网易云来练练手,并把过程中的心得写下来便于后面有想玩这个的童鞋们参考。
首先我们分析网页源码,找到我们想要的获取数据位置:
每一个标签对应着飙升榜中的一首歌曲,想要查看歌曲的详细信息,可以点开标签查看。
点开后,我们发现,关于歌曲时长,歌曲名称,歌曲id,图片,以及作者都可以在两个标签下找到,且想要获取的歌曲名,ID,图片以及作者都是后一个标签的不同属性值,分别对应的是‘data-res-nam’,‘data-res-id’,‘data-res-pic’,'data-res-author’属性的值。
知道我们要获取的数据具体位置后,我们就可以直接写代码来获取了。
在写代码前,我们再仔细看下网页源码,我们发现一个很有意思的现象:
我们发现我们要获取的数据,位于一个标签再嵌套的一个标签下面,然后我们发现中间有一个标签节点,其实这相当于是当前界面的子界面,最外层的是父界面,里面的是子界面(可以这么理解),当我们想要用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"
好了,接下来就可以直接上代码了:
# --encode:utf-8 --
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 = [] # 存放歌曲id的列表(网易云中显示的歌曲id)
self.songs_download_url_list = [] # 存放歌曲下载链接的列表
self.songs_info_list = [] # 存放歌曲所有信息的列表(便于后面存入数据库)