从零开始做歌词生成器 – 0 – 抓取网易云3万首歌词

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

转载请注明出处:从零开始做歌词生成器 – 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=

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

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

这里写图片描述

这里写图片描述

抓取代码

requests抓取函数及其他配置:

import os import json import requests from bs4 import BeautifulSoup base_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  林俊杰 3684 Maroon_5 96266 王菲 9621 李荣浩 4292 G.E.M.邓紫棋 7763 张学友 6460 杨宗纬 6066 许巍 5770 蔡健雅 7214 Adele 46487 Bruno_Mars  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/' + artist if 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行。抓取到的示例如下:

这里写图片描述

提示:

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211380.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午10:34
下一篇 2026年3月18日 下午10:34


相关推荐

  • ILA的使用

    ILA的使用摘要 介绍 ILA 必须掌握的两种使用 ILA 的高级使用 CaptureContr 和 AdvancedTrig 懂了后再来补

    2026年3月18日
    2
  • 网站测试计划模板

    网站测试计划模板要开始门户网站的测试了 整理的测试计划模板

    2025年11月8日
    4
  • asp数组的使用

    asp数组的使用定义简单数组有两种方法在 asp 中定义和初始化数组 让我们看看每种的例子 方法一 MyArray Array Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 数组大小由初始化元素个数决定 方法二 DimmyArray 2 指定数组大小 myArray 0 Jan myArray 1 Feb 数组动态扩展 DIMmyArray REDIMmyArray 20 将数组大小

    2026年3月18日
    2
  • Linux 文件系统与日志分析「建议收藏」

    Linux 文件系统与日志分析「建议收藏」文章目录1.前言2.深入理解Linux文件系统2.1inode与block详解(1)inode和block概述1.前言2.深入理解Linux文件系统2.1inode与block详解(1)inode和block概述  文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。一般连续八个扇区组成一个“块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区

    2022年5月9日
    49
  • Python 递归的多种写法

    Python 递归的多种写法题目背景:让我们来看一些例子。要对一个数字列表(或者其他序列)求和,我们可以使用内置的sum函数,或者自己编写一个更加定制化的版本。这里是用递归编写的一个定制求和函数的示例defmysum(L): ifnotL: return0 else: returnL[0]+mysum(L[1:])这是一种最基本的递归写法,通过递归的方式将列表中的所有进行相加,典型的鸭子类型…

    2022年6月16日
    37
  • CSS3 Transition[通俗易懂]

    CSS3 Transition[通俗易懂]Transition简介Transition可以设置CSS属性的过渡效果,它有以下几个属性。transition-property用于指定应用过渡属性的名称transition-duration用于指定这个过渡的持续时间transition-delay用于指定延迟过渡的时间transition-timing-function用于指定过渡的类型transition-p…

    2022年7月13日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号