随着近几年深度学习的发展,歌词生成器逐渐变为一个有趣而热门的研究点。这篇和接下来的几篇文章,将从零开始,记录数据的抓取、清洗与分析,到歌词生成模型的构建、训练与分析过程。
要做歌词生成器,首先得有丰富的数据。花了点时间在网易云音乐网页版上面摸索,最后找到了几个页面,几个API,终于把一整套的流程整理了出来。

转载请注明出处:从零开始做歌词生成器 - 0 - 抓取网易云3万首歌词

抓取流程分析

首先是这个页面:网易云音乐

基本上把热门的歌手都涵盖了,如果觉得不满足,还可以点左边的分栏,能找到更多的歌手。
接下来,以周董为例,点击进入周董的页面:周杰伦 - 网易云

周董页面的链接为:

http://music.163.com/#/artist?id=6452

每个歌手都有唯一的id,使用这个id就能找到歌手的页面。不过如果只抓这个链接的话,我们只能抓取到50首歌。点击所有专辑,发现每页列出了12张专辑。专辑页面的链接如下:

http://music.163.com/#/artist/album?id=6452

可以看到,参数依然是歌手的id。

为了不处理分页,可以再传一个limit参数:

http://music.163.com/#/artist/album?id=6452&limit=100

这样,所有的专辑都在一个页面显示。再点击进入一张专辑:

专辑页面链接为:

http://music.163.com/#/album?id=34720827

每一张专辑都有唯一的id。在点击进入一首歌,发现歌也是由id表示的。

http://music.163.com/#/song?id=415792916

这样,整个的思路就清晰了,先抓取所有热门歌手的id,再根据歌手id抓取其专辑列表,再根据每一张专辑的id抓取该专辑下所有歌曲id,再根据歌曲id抓取该歌曲的歌词。
整个从歌手到歌词是一个树形结构。

抓取代码

搞明白这个流程,接下来就是抓取的实现,目标是一次性把这些热门歌手的所有歌全部抓取下来。
环境依赖:python 3,requests 2,BeautifulSoup 4。

requests抓取函数及其他配置:

import os
import json
import requests
from bs4 import BeautifulSoupbase_url = "http://music.163.com"
start_url = base_url + "/artist/album?id={}&limit=100"  # 根据歌手的id,抓取其专辑列表
song_url = base_url + "/api/song/lyric?id={}&lv=1&kv=1&tv=-1"  # 根据歌曲的id,抓取歌词headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 ""(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36","Referer": "http://music.163.com","Host": "music.163.com"
}def get_html(url):  # requests抓取resp = requests.get(url, headers=headers)html = str(resp.content, encoding='utf-8', errors='ignore')return html

首先抓取歌手id列表,保存到文件中,注意到这是一个API,返回的是JSON数据,直接访问网页链接是无效的:

def find_artist_ids():"""只能拿到前100位的歌手ID"""url = 'http://music.163.com/api/artist/top?limit=100&offset=0'html = get_html(url)artists = json.loads(html)['artists']with open('artists.txt', 'w', encoding='utf-8', errors='ignore') as fa:for artist in artists:artist_name = artist['name'].strip().replace(" ", "_")fa.write(artist_name + ' ' + str(artist['id']) + '\n')

这样,100位歌手id就保存到了artists.txt中:

周杰伦 6452
陈奕迅 2116
薛之谦 5781
BIGBANG 126339
林俊杰 3684
Maroon_5 96266
王菲 9621
李荣浩 4292
G.E.M.邓紫棋 7763
张学友 6460
杨宗纬 6066
许巍 5770
蔡健雅 7214
Adele 46487
Bruno_Mars 178059
Coldplay 89365
。。。

这其中包含中日韩欧美各种语言歌手,可以根据需要自行增删歌手(比如这几篇就只关注中文),不过这篇中,先把全部都抓下来。
然后就是抓取的核心代码:

def crawl_lyrics(art_id):"""抓取一整个歌手的所有歌词"""html = get_html(start_url.format(art_id))  # 先抓该歌手的专辑列表soup = BeautifulSoup(html, 'lxml')artist = soup.find('h2', id='artist-name').text.strip().replace(' ', '_')artist_dir = 'data/' + artistif not os.path.exists(artist_dir):  # 歌手目录os.mkdir(artist_dir)print("歌手名:", artist)albums = soup.find('ul', class_='m-cvrlst').find_all('a', class_='msk')  # 专辑列表for album in albums:html = get_html(base_url + album.get('href'))  # 再抓取该专辑下歌曲列表soup = BeautifulSoup(html, 'lxml')album_title = soup.find('h2', class_='f-ff2').text.strip().replace(' ', '_').replace('/', '_')  # '/'会影响目录album_dir = os.path.join(artist_dir, album_title)if not os.path.exists(album_dir):  # 专辑目录os.mkdir(album_dir)print("  " + artist + "---" + album_title)links = soup.find('ul', class_='f-hide').find_all('a')  # 歌曲列表for link in links:song_name = link.text.strip().replace(' ', '_').replace('/', '_')song_id = link.get('href').split('=')[1]html = get_html(song_url.format(song_id))  # 抓取歌词try:  # 存在无歌词的歌曲,直接忽略lyric_json = json.loads(html)lyric_text = lyric_json['lrc']['lyric']open(os.path.join(album_dir, song_name + '.txt'), 'w', encoding='utf-8').write(lyric_text)print("    " + song_name + ", URL: " + song_url.format(song_id))except:print("    " + song_name + ": 无歌词, URL: " + song_url.format(song_id))print()

可以看到,整个代码的核心就是三层结构。保存的时候,也是按照层级结构来保存的。
下面开始抓取:

with open('artists.txt', 'r', encoding='utf-8') as f:for line in f:art_id = line.strip().split()[1]crawl_lyrics(art_id)

整个的代码,加上空行,加上输出提示,加上异常处理,不到80行。抓取到的示例如下:

整个100名歌手,大概3万7千多首,未经过任何清洗,当然有很多重复,比如说包含一些live的歌词。光陈奕迅一个人就有1370多首。
代码暂时放在这个repo里,到后面整合到完整的系统中:gaussic/lyric_crawler_163

如果想要现成的数据,我在百度云上面分享了一份:
链接:https://pan.baidu.com/s/1o9NNDjG 密码:0xe1

提示:

运行的代码的时候,发现半路上断了,估计是速度太快被禁止访问了(网易云不要来打我^o^),一个解决方案是,把抓完的歌手从artists.txt放到另外一个文件中,等一段时间,重新运行把剩下的抓了。另一个方案是,加代理,这样比较有效,不过速度比直接访问稍慢。经过测试,两者时间查不了太多。

下一篇再叙述,如何做一些数据清洗与简单的分析。

转载请注明出处:从零开始做歌词生成器 - 0 - 抓取网易云3万首歌词

从零开始做歌词生成器 - 0 - 抓取网易云3万首歌词相关推荐

  1. python音乐的数据抓取与分析_python抓取网易云音乐热评做词图数据分析

    最近就有一部"怀旧"题材的电影,未播先火,那就是刘若英的处女作--<后来的我们>.青春,爱情,梦想,一直是"怀旧"题材的核心要素,虽然电影现在还未上 ...

  2. python爬歌词_python爬虫抓取某易云音乐歌词,从此不在下载

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:企鹅号小编 ( 想要学习Python?Python学习 ...

  3. python爬虫网易云音乐最热评论并分析_Python3实现爬虫抓取网易云音乐的热门评论分析(图)...

    这篇文章主要给大家介绍了关于Python3实战之爬虫抓取网易云音乐热评的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. ...

  4. Python抓取网易云音乐热搜榜热评

    引子 啊~最有个小姐姐要做微信公众号,她需要优质的句子.文章,于是我想到了网易云每首伤感歌曲下面的评论,嗯~很感人,甚至有的时候真的感觉这里就是能触及我心灵最柔软的地方,正好这几天在学习python, ...

  5. Python3爬虫抓取网易云音乐热评实战

    前一段时间刚刚入门python爬虫,有大概半个月时间没有写python了,都快遗忘了.于是准备写个简单的爬虫练练手,我觉得网易云音乐最优特色的就是其精准的歌曲推荐和独具特色的用户评论,于是写了这个抓取 ...

  6. 带你写爬虫(python)第二篇----抓取网易云音乐下面的评论(API方式)

    抓取网易云音乐<大学无疆>的评论 一直喜欢使用网易云音乐,网易云歌曲下面的评论给其加分不少,所以这一篇来写一下怎么抓取歌曲下面的评论. 准备工作 目标网页:http://music.163 ...

  7. python爬虫网易云音乐评论最多的歌_Python3实战之爬虫抓取网易云音乐的热门评论...

    前言 之前刚刚入门python爬虫,有大概半个月时间没有写python了,都快遗忘了.于是准备写个简单的爬虫练练手,我觉得网易云音乐最优特色的就是其精准的歌曲推荐和独具特色的用户评论,于是写了这个抓取 ...

  8. python3之Scrapy+Selenium切换iframe抓取网易云音乐排行榜

    Scrapy+Selenium切换iframe抓取网易云音乐排行榜 iframe标签 Selenium (WEB自动化工具) Scrapy 框架 iframe标签 了解一下iframe 百度百科介绍的 ...

  9. 使用selenium抓取网易云音乐数据

    今天通过一个简单的网易云音乐排行榜数据抓取与音乐下载实战案例,带着大家一起来学习如何抓取动态生成的页面内容.网易云音乐排行榜网址:https://music.163.com/#/discover/to ...

最新文章

  1. 彩色图批量转换成灰度图、批量格式转换、批量重命名
  2. 去掉dist后php后缀也没有了,DVWA:环境搭建 - osc_gz5w458v的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. 七桥问题属于计算机科学方法论中的,计算机科学与技术方法论-计算学科中的科学问题ppt...
  4. 狄利克雷分布公式_深入机器学习系列11-隐式狄利克雷分布
  5. Tile-Based架构下的性能调校
  6. pythonread读取怎么是乱码_python中如何读写文件不乱码
  7. CTF---Web入门第二题 上传绕过
  8. 最好用的十六进制编辑器 010 Editor
  9. latex附录中放python代码_LaTeX 里「添加程序代码」的完美解决方案
  10. 01_01_三步开启C语言编程_小白篇
  11. 中专高一第一学期计算机应用期中基础考题,职业中专第一学期计算机应用基础WIN7和Word2010版期末考试题...
  12. 泰禾智能:智能改变未来,成就工业设备行业佼佼者
  13. python你已经是个成熟的软件了_你已经是个成熟的系列表情包大全_支付宝微信等软件中招_软吧...
  14. Android手机获取屏幕分辨率高度因虚拟导航栏带来的问题
  15. 【xbox开发】unity3d xbox one手柄键位
  16. oracle erp 库存账龄,系统管理、年结后,新年度做账龄分析,原来几年的账龄-用友U8...
  17. 关于mask蒙尘效果触发
  18. OI中组合数学公式和定理90%歼灭
  19. 09:判断能否被3,5,7整除
  20. mac应用程序在哪_如何在Mac上列出所有应用程序

热门文章

  1. 使用 TensorFlow 2.0 进行分布式训练
  2. MySQL基础(四)运算符
  3. java app支付_java实现微信App支付
  4. 如何用Cocos2d-JS制作一个微信报名宣传页
  5. day04-图片、列表、超链接标签及属性
  6. 总裁福布斯约稿:人工智能与差异化的探讨
  7. Old Man‘s Journey 1.9 (老人之旅) for Mac 中文版 解谜冒险游戏
  8. 2019年软考及格分数线
  9. 5.21 Linear Transformer
  10. JUC并发编程(一)