在网易云音乐中第一页歌单的url:http://music.163.com/#/discover/playlist/

依次第二页:http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=35

依次第三页:http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=70

然后从歌单的查看框架的源代码:

从图中的源代码可以得到每个歌单的url:eg:http://music.163.com/#/playlist?id=696806036

然后相应的歌单页面中可以得到歌单中每首歌的名字和歌手:

然后歌名歌手,在百度音乐搜索api接口获得songid,api是url = "http://sug.music.baidu.com/info/suggestion"

截图来自:贴吧

然后从获取到的songid从百度音乐免费API接口:http://music.baidu.com/data/music/fmlink,获取songLink进行下载,并且将songLink保存到本地.flac

eg;http://music.baidu.com/data/music/fmlink?rate=320&songIds=242078437&type=flac

下载结果:

代码:

# -*- coding: utf-8 -*-
import re
import urllib
import urllib2
import os
import stat
import itertools
import re
import sys
import requests
import json
import time
import socket
import urlparse
import csv
import random
from datetime import datetime, timedelta
import lxml.html from zipfile import ZipFile
from StringIO import StringIO
from downloader import Downloader
from bs4 import BeautifulSoup
from HTMLParser import HTMLParser
from itertools import product
import sys
reload(sys)
sys.setdefaultencoding('utf8')
URL = 'http://music.163.com'
NUM = 5
def download(url, user_agent='wswp', num_try=2): headers = {'User_agent': user_agent}
request = urllib2.Request(url, headers=headers)
try:
html = urllib2.urlopen(request).read()
except urllib2.URLError as e:
print 'Download error', e.reason
html = None
if num_try > 0:
if hasattr(e, 'code') and 500 <= e.code < 600:
return download(url, user_agent, num_try - 1)
return html def get_song_list(url):
html = download(url)
res = r'<ul class="f-hide">(.*?)</ul>'
mm = re.findall(res,html,re.S | re.M)
#print mm
res = r'<li><a .*?>(.*?)</a></li>'
song_list = re.findall(res, html,re.S | re.M)
return song_list #获取网易云歌单 eg:/playlist?id=706469943
def get_play_list(html):
soup = BeautifulSoup(html, "html.parser")
results = soup.find_all(name='a', attrs={'class': 'tit f-thide s-fc0'})
list = []
for each in results:
ee = each.get('href')
list.append(ee)
return list def download_music(url, song_name):
print "Downloading song_name:" + song_name
path = "songs"
if not os.path.isdir(path):
os.mkdir(path)
f = open(path + '/' + song_name + '.flac', 'wb')
f.write(download(url))
f.close() def download_song(song_name,singer): url = "http://sug.music.baidu.com/info/suggestion"
#百度音乐搜索获得songid
mess = song_name + singer
payload = {'word': mess, 'version': '2.1.1', 'from': ''}
r = requests.get(url, params=payload)
contents = r.text
d = json.loads(contents, encoding="utf-8")
#print d
if ('data' not in d):
print "do not have flac"
return 0
if ('song' not in d["data"]):
print "do not have flac"
return 0
song_id = d["data"]["song"][0]["songid"] print "song_id:"+song_id url = "http://music.baidu.com/data/music/fmlink" #百度音乐免费api接口
'''
http://music.baidu.com/data/music/fmlink?rate=320&songIds=242078437&type=&callback=cb_download&_t=1468380564513&format=json
'''
payload = {'songIds': song_id, 'type': 'mp3'}
r = requests.get(url, params=payload)
contents = r.text
try:
d = json.loads(contents, encoding="utf-8")
except:
return 0
if d is not None and 'data' not in d or d['data'] == '':
return 0
songlink = d["data"]["songList"][0]["songLink"]
if (len(songlink) < 10):
print "do not have flac"
return 0
print "Song Source: " + songlink
download_music(songlink,mess) def get_song_singer(url):
html = download(url)
soup = BeautifulSoup(html, "html.parser")
results = soup.find_all(name='textarea', attrs={'style': 'display:none;'})
mess = str(results[0])
tt = len('<textarea style="display:none;">')
result = mess[tt:]
tt = len('</textarea>)')-1
resu = result[:-tt]
list = json.loads(resu, encoding="utf-8")
singer_list = []
for each in list:
singer_list.append(each["artists"][0]["name"])
return singer_list if __name__ == '__main__': num = 0
for flag in range(1,5):
if flag > 1:
page = (flag - 1) * 35
url = 'http://music.163.com/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset='+str(page)
else:
url = 'http://music.163.com/discover/playlist'
print url
html = download(url)
list = get_play_list(html)
for i in list:
song_list_url = URL + i
print song_list_url
singer_list = get_song_list(song_list_url)
singer_name = get_song_singer(song_list_url)
tt = len(singer_list)
mm = len(singer_name)
index = min(tt,mm)
num = num + mm
for j in range(0, index):
print singer_name[j]
print singer_list[j]
download_song(singer_list[j],singer_name[j])
print "\n" print "Download " + str(num) + " music\n"
												

python爬取网易云音乐歌单音乐的更多相关文章

  1. Python爬取网易云热歌榜所有音乐及其热评

    获取特定歌曲热评: 首先,我们打开网易云网页版,击排行榜,然后点击左侧云音乐热歌榜,如图: 关于如何抓取指定的歌曲的热评,参考这篇文章,很详细,对小白很友好: 手把手教你用Python爬取网易云40万 ...

  2. 爬虫实战(二) 用Python爬取网易云歌单

    最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...

  3. Python爬取网易云音乐歌手歌曲和歌单

    仅供学习参考 Python爬取网易云音乐网易云音乐歌手歌曲和歌单,并下载到本地 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做 ...

  4. 用Python爬取网易云音乐热评

    用Python爬取网易云音乐热评 本文旨在记录Python爬虫实例:网易云热评下载 由于是从零开始,本文内容借鉴于各种网络资源,如有侵权请告知作者. 要看懂本文,需要具备一点点网络相关知识.不过没有关 ...

  5. Python爬取网易云歌单

    目录 1. 关键点 2. 效果图 3. 源代码 1. 关键点 使用单线程爬取,未登录,爬取网易云歌单主要有三个关键点: url为https://music.163.com/discover/playl ...

  6. Python 爬取网易云歌手的50首热门作品

    使用 requests 爬取网易云音乐 Python 代码: import json import os import time from bs4 import BeautifulSoup impor ...

  7. python爬取网易云音乐歌曲评论信息

    网易云音乐是广大网友喜闻乐见的音乐平台,区别于别的音乐平台的最大特点,除了“它比我还懂我的音乐喜好”.“小清新的界面设计”就是它独有的评论区了——————各种故事汇,各种金句频出.我们可以透过歌曲的评 ...

  8. python爬取网易云周杰伦所有专辑,歌曲,评论,并完成可视化分析

    ---恢复内容开始--- 去年在网络上有一篇文章特别有名:我分析42万字的歌词,为搞清楚民谣歌手们在唱些什么.这篇文章的作者是我大学的室友,随后网络上出现了各种以为爬取了XXX,发现了XXX为名的文章 ...

  9. 如何用Python网络爬虫爬取网易云音乐歌曲

    今天小编带大家一起来利用Python爬取网易云音乐,分分钟将网站上的音乐down到本地. 跟着小编运行过代码的筒子们将网易云歌词抓取下来已经不再话下了,在抓取歌词的时候在函数中传入了歌手ID和歌曲名两 ...

随机推荐

  1. URAL1519:Formula 1——题解

    http://acm.timus.ru/problem.aspx?space=1&num=1519 https://vjudge.net/problem/URAL-1519 题目大意:给一个网 ...

  2. 关于kali linux系统的简单工具

    Linux系统中关于几个重要目录的原英文解释: /etc/: Contains configuration files of the installed tools /opt/: Contains M ...

  3. 洛谷 P1854 花店橱窗布置 【dp】

    题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...

  4. 如何设置eclipse格式化xml代码时不自动换行

    如何设置eclipse格式化代码时不自动换行 2015年12月23日 09:08:36 qq_20889581 阅读数:3770 标签: eclipse格式化android 更多 个人分类: Ecli ...

  5. 虚拟机安装ubuntu14.04.5系统

    参考教程 在vitualbox安装 ubuntu14.04.2 LTS教程 http://jingyan.baidu.com/article/46650658228345f549e5f8cc.html ...

  6. Java修饰符 public、protected、default、private

    2.访问修饰符public,private,protected,以及不写(默认)时的区别?答: 修饰符 当前类 同 包 子 类 其他包 public √ √ √ √ protected √ √ √ × ...

  7. Mongodb 备份 还原 导出 导入 等批量操作

    mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport. 一,mongodump备份数 ...

  8. checkbox选择根据后台List数据进行回显

    需求:记住用户已经选择的 checkbox 选项,当用户再次对该 checkbox 进行选择操作时,应对该用户已经选择的 checkbox 选项进行选中操作. 示例代码: checkbox,js遍历后 ...

  9. <LC刷题一>相加为0的数之leetcode1&2&15&16

    --题目导航见页面左上角的悬浮框#目录导航#-- 相似题型导航 1.1 twosum两数之和  ||  2.2 3Sum三数之和  ||  2.3 3Sum Closest最接近的三数之和 ----- ...

  10. JavaScript Promises 实现框架一览及对比

    In my previous post in Danish I looked at how to perform asynchronous calls by using promises. Now t ...