爬取网易云音乐(包括歌词和评论)

# 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

from urllib import request,parse
import pymysql
from bs4 import BeautifulSoup
import re
import random
from selenium import webdriver
import time
import json
import requests

def singer():
    base_url = ‘http://music.163.com/discover/artist/cat?id=1001‘

    user_agent = [
        ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0‘,
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",

    ]
    ua = random.choice(user_agent)

    headers = {
        ‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8‘,
        # Accept-Encoding:gzip, deflate, sdch,
        ‘Accept-Language‘: ‘zh-CN,zh;q=0.8‘,
        ‘Cache-Control‘: ‘max-age=0‘,
        ‘Connection‘: ‘keep-alive‘,
        ‘Cookie‘: ‘_ntes_nnid=9590bff1d254dd7fa3f25d8e0d311522,1510122577046; _ntes_nuid=9590bff1d254dd7fa3f25d8e0d311522; _ngd_tid=dGE34taznjKAcDgyTJtO2J7d%2Bg%2BOLdSZ; usertrack=ezq0pVqnqQJAj7faBRRpAg==; __f_=1521533778639; starttime=; NTES_SESS=gWckWp0kS7P8.9Ll7xa1C2UB_4KpPrwEUUnWVSgGwgUuP_OdPs6CJlnou4rhyTwLPIJVjVNPLy3yX18e7HET2ih10YmTlRyC72K7.chKLFGewToNDdDACY3ojifgYw5TipjDIF7JEcSBMG6jhgsdk4TJayFaVg0m3mSciKsZf0JgHiZjNW9Urz_X2s8tcyGw9.DPBx6s5eROyccVAQqxWLj.v33_K253y; S_INFO=1523348346|0|3&80##|m13349949963_1; [email protected]|1523348346|0|mail163|00&99|null&null&null#jix&360100#10#0#0|133963&1||[email protected]; [email protected]:-1:1; df=mail163_letter; Province=0790; City=0791; MUSIC_EMAIL_U=8e19f5c8cbc11303a2d71c0d3532255599dcb9d14e06692f6202bc9e762f9363b95b9657afa5636f8b99162d656ec71eead030040e2add0d4bcf6e8189568a96; playliststatus=visible; JSESSIONID-WYYY=dwTSf7No9xGH7HzrhqYcwnPQIVAnwgM6Pq%2FO%5ClmDiH2l5ScrkuvMSG%2BYZutH6wAz9WPwmNoo2evEm9Ee%2B%2Fa3%5Cx%5C%2B%2FUoToq37TQd%2BkzRzkSimgZlpbqnQXVP%5Cdu86phA4Se0w%2FQpgg15A8%2FjES3ahRByglGzMjzuiSSE8DRk%2B9ojksu33%3A1523358787887; _iuqxldmzr_=32; __utma=94650624.199382336.1520261898.1523349418.1523355839.5; __utmb=94650624.21.10.1523355839; __utmc=94650624; __utmz=94650624.1523349418.4.2.utmcsr=baidu|utmccn=(organic)|utmcmd=organic‘,
        ‘Host‘: ‘music.163.com‘,
        ‘Referer‘: ‘http://music.163.com/‘,
        ‘Upgrade-Insecure-Requests‘: 1,
        ‘User-Agent‘: ua
    }
    req = request.Request(base_url, headers=headers)
    response = request.urlopen(req)
    html = response.read()
    html = html.decode(‘utf-8‘)
    soup = BeautifulSoup(html, ‘lxml‘)
    singers= soup.select(".m-sgerlist")[0]
    lis = singers.find_all([‘li‘])
    #取歌手的名字
    for li in lis:
        #歌手名
        singer = li.select(‘a[class="nm nm-icn f-thide s-fc0"]‘)[0].text
        href = li.select(‘a[class="nm nm-icn f-thide s-fc0"]‘)[0].attrs[‘href‘]
        # print(singer,type(singer))
        pattern = re.compile(‘[0-9]+‘)
        id = pattern.findall(href)[0]
        num = int(id)
        # print(id,type(id))
        conn = pymysql.connect(‘127.0.0.1‘,‘root‘,‘zb376100870‘,‘163_song‘,charset=‘utf8‘)
        cursor = conn.cursor()
        sql = "insert into singer_tb(sger_name,sger_num) VALUE (%s,%s)"
        data = (singer,num)
        cursor.execute(sql,data)
        conn.commit()

        #获取专辑
        album(id,headers)

def album(id,headers):
    # if id == ‘6452‘:
    sger_num = int(id)
    for i in range(10):
        j = i*12
        sger_url = ‘http://music.163.com/artist/album?id=%d&limit=12&offset=%d‘%(sger_num,j)
        req = request.Request(sger_url,headers=headers)
        response = request.urlopen(req)
        html = response.read()
        html = html.decode(‘utf-8‘)
        soup = BeautifulSoup(html,‘lxml‘)
        albums = soup.select(‘#m-song-module‘)
        # print(‘123456‘+html)
        if albums != []:
            lis = albums[0].find_all([‘li‘])
            # print(lis)
            for li in lis:

                album_name = li.select(‘a[class="tit s-fc0"]‘)[0].text
                href = li.select(‘a[class="tit s-fc0"]‘)[0].attrs[‘href‘]
                pattern = re.compile(‘[0-9]+‘)
                album_id = pattern.findall(href)[0]
                album_num = int(album_id)
                # print(album_name)
                conn = pymysql.connect(‘127.0.0.1‘, ‘root‘, ‘zb376100870‘, ‘163_song‘, charset=‘utf8‘)
                cursor = conn.cursor()
                sql = "insert into album_tb(album_name,album_num,sger_num) VALUE (%s,%s,%s)"
                data = (album_name, album_num,sger_num)
                cursor.execute(sql, data)
                conn.commit()

                song(album_num,headers,sger_num)

def song(album_num,headers,sger_num):
    # print(album_num,type(album_num))
    song_url = ‘http://music.163.com/album?id=%d‘%(album_num)
    req = request.Request(song_url, headers=headers)
    response = request.urlopen(req)
    html = response.read()
    html = html.decode(‘utf-8‘)
    soup = BeautifulSoup(html, ‘lxml‘)
    # albums = soup.select(‘#m-song-module‘)
    # print(html)
    album_song = soup.select(‘ul[class="f-hide"]‘)[0]
    songs = album_song.find_all([‘a‘])
    for song in songs:
        song_name = song.text
        href = song.attrs[‘href‘]
        pattern = re.compile(‘[0-9]+‘)
        song_id = pattern.findall(href)[0]
        song_num = int(song_id)

        print(song_name,song_num,album_num,sger_num)
        # conn = pymysql.connect(‘127.0.0.1‘, ‘root‘, ‘zb376100870‘, ‘163_song‘, charset=‘utf8‘)
        # cursor = conn.cursor()
        # sql = "insert into song_tb(song_name,song_num,album_num,sger_num) VALUE (%s,%s,%s,%s)"
        # data = (song_name, song_num,album_num, sger_num)
        # cursor.execute(sql, data)
        # conn.commit()

        word_cmts(song_name, song_num,album_num, sger_num,headers)
        # word_cmts(song_num,headers)

def word_cmts(song_name, song_num,album_num, sger_num,headers):
    print(song_num)
    word_url = ‘http://music.163.com/api/song/lyric?‘ + ‘id=‘ + str(song_num) + ‘&lv=1&kv=1&tv=-1‘
    # cmts_url = ‘http://music.163.com/api/v1/resource/comments/R_SO_4_185807?id=‘ + str(song_num) + ‘&lv=1&kv=1&tv=-1‘
    # cmts_url = ‘http://music.163.com/api/v1/resource/comments/R_SO_4_185807?id=531051217&lv=1&kv=1&tv=-1‘

    req = request.Request(word_url, headers=headers)
    response = request.urlopen(req)

    html = response.read()
    html = html.decode(‘utf-8‘)
    j = json.loads(html)
    print(‘~~~~~~~~~~~‘,j)
    if ‘lrc‘ in j:
        lrc = j[‘lrc‘][‘lyric‘]
    # print(lrc)
        pat = re.compile(r‘\[.*\]‘)
        lrc = re.sub(pat,"",lrc)
        lrc = lrc.strip()
    else:
        lrc = ‘‘
    # print(lrc,type(lrc))

    cmts_url = ‘http://music.163.com/api/v1/resource/comments/R_SO_4_‘ + str(song_num) + ‘?id=‘ + str(song_num) + ‘&lv=1&kv=1&tv=-1‘
    # cmts_url = ‘http://music.163.com/api/v1/resource/comments/R_SO_4_185807?id=531051217&lv=1&kv=1&tv=-1‘

    req = request.Request(cmts_url,headers=headers)
    response = request.urlopen(req)
    html = response.read()
    html = html.decode(‘utf-8‘)
    c = json.loads(html)
    cmts = c[‘hotComments‘]
    lst = []
    for cmt in cmts:
        comment = cmt[‘content‘]
        comment = comment.strip()
        # print(comment)
        # patttern = re.compile(r‘[a-zA-Z0-9\w+]+‘)
        # comment = re.sub(patttern,‘‘,comment)
        # comment = comment.strip()
        # print(comment)

        lst.append(comment)
    cmmt = str(lst)
    # print(cmmt,type(cmmt))

    try:
        # python UCS-4 build的处理方式
        highpoints = re.compile(u‘[\U00010000-\U0010ffff]‘)
    except re.error:
        # python UCS-2 build的处理方式
        highpoints = re.compile(u‘[\uD800-\uDBFF][\uDC00-\uDFFF]‘)

    cmmt = highpoints.sub(u‘??‘, cmmt)
    # print(cmmt)

    conn = pymysql.connect(‘127.0.0.1‘, ‘root‘, ‘zb376100870‘, ‘163_song‘, charset=‘utf8‘)
    cursor = conn.cursor()
    sql = "insert into song_tb(song_name,song_num,album_num,sger_num,song_lrc,song_cmts) VALUE (%s,%s,%s,%s,%s,%s)"
    data = (song_name, song_num, album_num, sger_num,lrc,cmmt)
    cursor.execute(sql, data)
    conn.commit()

if __name__ == ‘__main__‘:

    singer()

  

字段说明

Singer_tb是歌手表,包括的字段有:

Sger_id:用于计数和排序

Sger_name:歌手名称

Sger_num:歌手名称对应的编号,可用于多表联查

歌手数量:6位

Album_tb:是专辑表,包括的字段有:

Albun_id:用于计数和排序

Album_name:专辑名称

Album_num:专辑编号,可用于和表song_tb歌曲表进行多表联查

Sger_num:歌手名称对应的编号,可用和singer_tb歌手表进行多表联查,

专辑数量:223张

Song_tb:是歌曲表,包括的字段有:

Song_id:用于计数和排序

Song_name:歌曲名称

Song_num:歌曲编号

Album_num:专辑编号,可用于和表song_tb歌曲表进行多表联查

Sger_num:歌手名称对应的编号,可用和singer_tb歌手表进行多表联查,

Song_lrc:歌词

Song_cmts:歌曲评论

歌曲数量:2286条

多表联查简单说明

每个表与表之间的对应关系已经匹配好,可用多表联查实现(具体操作可在数据库中实现),

看周杰伦的资料,可以看到周杰伦的所有歌曲和专辑,都可用多表联查.

例如:在数据库终端中输入select song_name,sger_name from song_tb,singer_tb

Where song_tb.sger_num = singer_tb.sger_num; 只是一个多表联查的例子

遇到的问题:

  1. 歌词的接口问题,由于js加密的方法比较复杂,我找到的是api接口,直接可以获取歌词
  2. 评论的插入数据库的问题,遇到的是emoji表情插不进去的情况,需要对评论的表情去掉,

原因是数据库的编码问题,数据库默认的是utf8编码,一般一个字符占三个字节,但是 emoji表情占4个字节,导致插入不进去的情况发生,用的是正则方法去掉emoji表情。

原文地址:https://www.cnblogs.com/zxf123/p/8909154.html

时间: 2024-08-25 16:52:07

爬取网易云音乐(包括歌词和评论)的相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

使用爬虫抓取网易云音乐热门评论生成好玩的词云

互联网爬虫是一个很有意思的技术,借由爬虫,我们可以做到很多好玩的事情--这其中就包括爬取评论. 词云就是个更好玩的技术,通过技术方法分析词语出现频率,生成可视化的图形,将文字内容用图形呈现,想想就很意思. 这次,我们就试着把这两个技术结合起来吧. 前言 网易云音乐一直是我向往的"神坛",听音乐看到走心的评论的那一刻,高山流水.于是今天来抓取一下歌曲的热门评论.并做成词云来展示,看看相对于这首歌最让人有感受的评论内容是什么. 做成词云的好处就是直观以及美观, 其他的我也想不出来有什么了.

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

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