Python爬虫网易云歌词及词频统计--(周杰伦top50)
2018-03-15 09:58
886 查看
本篇博客是利用Python爬虫网易云音乐,并利用jieba分词,对歌词进行分词,然后分析周杰伦top50中最常出现的词语。
我们先尝试获取一首歌的歌词吧,比如等你下课这首歌
上面的id就是等你下课这首歌的id,但是这种不适合批量提取,所以最好从网页的html中提取歌曲的id,这才是正确方法
如果想保存成文本,加入下面代码
参考博客:
https://www.cnblogs.com/Beyond-Ricky/p/6757954.html
我们先尝试获取一首歌的歌词吧,比如等你下课这首歌
上面的id就是等你下课这首歌的id,但是这种不适合批量提取,所以最好从网页的html中提取歌曲的id,这才是正确方法
一丶根据歌id提取一首歌的歌词
import requests import json import re #根据歌词id提取歌词 lrc_url = 'http://music.163.com/api/song/lyric?' + 'id=' + str(531051217) + '&lv=1&kv=1&tv=-1' lyric = requests.get(lrc_url) json_obj = lyric.text j = json.loads(json_obj) lrc = j['lrc']['lyric'] pat = re.compile(r'\[.*\]') lrc = re.sub(pat, "", lrc) lrc = lrc.strip() print(lrc)
如果想保存成文本,加入下面代码
f=open("D:/等你下课.txt",'w') for each in lrc: f.write(each)
二丶提取歌手一系列歌曲id
import requests from bs4 import BeautifulSoup singer_url = 'http://music.163.com/artist?id=' + str(6452) # 获取歌手链接,根据歌手的id获取数据 web_data = requests.get(singer_url) soup = BeautifulSoup(web_data.text, 'lxml') singer_name = soup.select("#artist-name")#获取歌手名字 r = soup.find('ul', {'class': 'f-hide'}).find_all('a') r = (list(r)) music_id_set = []#此歌手音乐的id列表 music_name_set=[]#此歌手音乐的名字列表 for each in r: song_name = each.text # 歌曲名字 music_name_set.append(song_name) song_id = each.attrs["href"] music_id_set.append(song_id[9:])#歌曲id,从第九个字符开始取id,上面图片展示过 print(music_id_set) dic = dict(map(lambda x, y: [x, y], music_id_set,music_name_set)) # 将音乐名字和音乐id组成一个字典 print(dic)
三丶根据歌曲id批量提取歌词
根据上面的id批量获取歌词,把上面的根据id获取单曲歌词的代码写成函数形式def get_lyric_by_music_id(music_id): # 定义一个函数,通过音乐的id得到歌词 lrc_url = 'http://music.163.com/api/song/lyric?' + 'id=' + str(music_id) + '&lv=1&kv=1&tv=-1' lyric = requests.get(lrc_url) json_obj = lyric.text # print(json_obj) j = json.loads(json_obj) # print(type(j))#打印出来j的类型是字典 try: # 部分歌曲没有歌词,这里引入一个异常 lrc = j['lrc']['lyric'] pat = re.compile(r'\[.*\]') lrc = re.sub(pat, "", lrc) lrc = lrc.strip() return lrc except KeyError as e: pass for i in music_id_set: f=open("D:/untitled/"+dic[i]+".txt",'w') lyric = get_lyric_by_music_id(i)#获取某一首歌的歌词 if lyric==None:#有的歌没有歌词 醉了哈 print("No lyric") continue else: print(dic[i]) # 单个文件存储一个歌手某一首歌以歌名命名 try: for index in lyric: f.write(index) except UnicodeEncodeError as u: continue f.close()
四丶利用jieba分词进行词频统计
我们把上面的代码改一下,让50首歌曲歌词全部放到一个文件夹下,为下面分词做准备import jieba #读词 file=open("D:/untitled/周杰伦歌词.txt",'r') lyric_str=file.read() seg=jieba.cut(lyric_str)#jieba分词 word_list=[] word_dict={} for each in seg: #print(each+' ') if len(each)>1:#过滤长度为1的词 word_list.append(each)#加入到词语列表中 for index in word_list:#遍历词语列表 if index in word_dict: word_dict[index]+=1#根据字典键访问键值,如果该键在字典中,则其值+1 else: word_dict[index]=1#如果键不在字典中,则设置其键值为1 sorted(word_dict.items(),key=lambda e:e[1],reverse=False) fc=open("D:/untitled/fenci.txt",'w') for item in word_dict.items(): print(item) fc.write(item[0]+str(item[1])+'\n')#将分词词频输出到txt文本中 #将分词和词频输出到excel中 file=Workbook() table=file.add_sheet('data') ldata = [] num = [a for a in word_dict] num.sort() for item in num:#频次 ldata.append(str(word_dict[item]))#次数 for i in range(1000): table.write(i,0,num[i]) table.write(i,1,ldata[i]) file.save("D:/untitled/fenci.xls")
参考博客:
https://www.cnblogs.com/Beyond-Ricky/p/6757954.html
相关文章推荐
- Python 3爬虫网易云(九)—— 获取一个歌手的热门50首歌词
- python爬虫之2017政府工作报告词频统计
- Python 3爬虫网易云(十)—— 爬取歌词读入文件存储
- Python 3爬虫网易云(五)—— 正则表达式下篇之HTML标签
- python:百度贴吧,统计ID回复数的爬虫,附源码
- python简单练习 -统计文本词频并用柱状图显示
- python瓦登尔湖词频统计
- 陆金所—稳盈-e享统计-python爬虫
- python实现爬虫统计学校BBS男女比例之数据处理(三)
- 使用Python+NLTK实现英文单词词频统计
- Python分词并进行词频统计
- python--更干净的词频统计
- python代码简单实现一个词频统计
- python结巴分词以及词频统计实例
- 通过python爬虫统计?站此时直播在线总人数
- Python由词频统计改编的数据分组汇总
- 利用结巴分词的Python版本实现分词并统计词频
- python 词频的统计多种方式
- python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
- python实现爬虫统计学校BBS男女比例之数据处理(三)