python爬取网易云音乐歌单音乐

在网易云音乐中第一页歌单的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‘: ‘0‘}
    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"
				
时间: 2024-10-08 11:00:19

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

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

网易云音乐是广大网友喜闻乐见的音乐平台,区别于别的音乐平台的最大特点,除了"它比我还懂我的音乐喜好"."小清新的界面设计"就是它独有的评论区了------各种故事汇,各种金句频出.我们可以透过歌曲的评论数来判断一个歌者的市场分量和歌曲的流行度.言归正传,如果我们想要简单爬取指定歌曲的评论内容来做词云或者其他相关数据分析,有没有容易上手的好方法呢? 首先,我们打开网易云音乐的网页版:https://music.163.com/,随便选择一首歌曲,如林志炫版本的<

爬取网易云听歌排行榜歌单制作云词

最近又到了一年一度的年底总结了,网易云音乐如此退出了年度歌单,又一次被刷朋友圈了.作为程序员,就好奇的想验证下结论准不准,随便回顾下爬虫的操作.首先,打开网页版网易云音乐,登录成功后,进入自己或好友的听歌排行榜,如图:直接使用浏览器的开发工具,刷新页面查看接口及其返回结果,找到刷新该列表的接口,如图:找到url后,再找到对应的cookie等值,复制保存.如图:至此,我们已经找到网页所有想要的信息了,下面我们就可以直接用代码实现了.思路:```a.先爬取歌曲列表,获取对应歌曲的信息,存放到数据库,

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

---恢复内容开始--- 去年在网络上有一篇文章特别有名:我分析42万字的歌词,为搞清楚民谣歌手们在唱些什么.这篇文章的作者是我大学的室友,随后网络上出现了各种以为爬取了XXX,发现了XXX为名的文章.我想了想,我能不能也通过爬虫来做些什么呢?先入为主,我也以歌曲作为切入口---周杰伦,是的,我们这一代的生活成长,总是离不开周董的声音的陪伴,那我就来爬取周董的歌曲,歌曲评论,歌词,以及各种有用的信息并做一个可视化吧. 这篇文章适合于python纯小白,因为本人也是python刚刚入门,里面可能很

如何用Python网络爬虫爬取网易云音乐歌词

前几天小编给大家分享了数据可视化分析,在文尾提及了网易云音乐歌词爬取,今天小编给大家分享网易云音乐歌词爬取方法. 本文的总体思路如下: 找到正确的URL,获取源码: 利用bs4解析源码,获取歌曲名和歌曲ID: 调用网易云歌曲API,获取歌词: 将歌词写入文件,并存入本地. 本文的目的是获取网易云音乐的歌词,并将歌词存入到本地文件.整体的效果图如下所示: 基于Python网易云音乐歌词爬取 赵雷的歌曲 本文以民谣歌神赵雷为数据采集对象,专门采集他的歌曲歌词,其他歌手的歌词采集方式可以类推,下图展示

xpath+多进程爬取网易云音乐热歌榜。

用到的工具,外链转换工具 网易云网站直接打开源代码里面并没有对应的歌曲信息,需要对url做处理, 查看网站源代码路径:发现把里面的#号去掉会显示所有内容, 右键打开的源代码路径:view-source:https://music.163.com/#/discover/toplist?id=3778678 去掉#号后:view-source:https://music.163.com/discover/toplist?id=3778678 资源拿到了,开始写代码: import requests

python学习之爬虫(一) ——————爬取网易云歌词

接触python也有一段时间了,一提到python,可能大部分pythoner都会想到爬虫,没错,今天我们的话题就是爬虫!作为一个小学生,关于爬虫其实本人也只是略懂,怀着"Done is better than perfect"的态度硬着头皮开始了这篇文章的撰写!好了,废话不多说! 先说一下今天我们的目的,作为一个音痴但不影响我对于音乐的执着,所以今天我们爬取的是网易云音乐,我们将会通过代码爬取歌词并写入到本地. 作为新手,我很本能就打开页面复制了url,然后用Beautifulsou

python3.基础爬取网易云音乐【超详细版】

简单学习了python爬虫之后,我们就可以嘿咻嘿咻了...因为平时就是用网易云听的歌,也喜欢看歌里的评论,所以就爬网易云音乐评论吧! 正式进入主题 首先还是去找目标网页并开始分析网页结构,如下 上面的三个箭头都是所要找的数据,分别是评论用户,评论和点赞数,都可以用正则表达式找出来,接下来继续找怎样找到下一页的数据,还是用开发者工具,但是当点击下一页的时候,网页的url没有变,说明网页是动态加载,所以就不能在当前网页找数据了,应该在他的xhr文件里找,所以点入network看看,然后也点击下一页一

利用python广西快乐十分源码出租爬取网易云歌手top50歌曲歌词

python广西快乐十分源码出租 dsluntan.com Q:3393756370 VX:17061863513近年来,发展迅速,成为了最炙手可热的语言. 那么如何来进行网易云歌手top50的歌曲歌词爬取呢 首先进行网易云并进行喜欢的歌手搜索如下: 在这里需要注意的是http://music.163.com/#/artist?id=1007170并不是真的我们需要的连接,真实的链接应该是http://music.163.com/artist?id=1007170 搞清楚了连接的问题之后,就要进

爬取网易云音乐评论并使用词云展示

最近听到一首很喜欢的歌,许薇的<我以为>,评论也很有趣,遂有想爬取该歌曲下的所有评论并用词云工具展示. 我们使用chrome开发者工具,发现歌曲的评论都隐藏在以 R_SO_4 开头的 XHR 文件中 接下来思路就很明确,拿到该文件,解析该文件的 json 数据,拿到全部评论. 我们可以看到该文件有两个用JS加密的参数 params 和 encSecKey ,关于这两个加密参数,参考了知乎用户的解答:https://www.zhihu.com/question/36081767 . 步骤: 1.