python 3个人学习笔记-批量下载分析歌词中单词频率

0.为什么要玩这个
听戳爷歌的时候网易云评论下面很多人说“我发现他歌词都是pool,summer之类的词语”
对于这个结果我是怀疑的……然而如果一篇一篇copy到excel里统计就很不酷炫了,那么我们就来现场学习一下用python怎么抓取网页以及用正则表达式筛选好了。
(也是为了随时好奇其他歌手高频词是什么)
一开始用了urllib抓一个很简陋的网站:
https://www.azlyrics.com/
然后研究到一半它突然无法访问了(随后得知是因为ip被封)。
尸体的代码如下

import requests
import re
import time
from bs4 import BeautifulSoup


time.sleep(4)
#防止被当作机器人
proxies={'http':'http://93.167.224.213:80'}
headers={'User-Agent':'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25'}
ty_url="https://www.azlyrics.com/t/troyesivan.html"

先做一些准备工作,设置好要爬的网站和代理ip,伪装成浏览器的UA

#在歌手主页获取歌词子界面的链接
ty_response=requests.get(ty_url,headers=headers,proxies=proxies)
ty_soup=BeautifulSoup(ty_response.content,'lxml')

使用requests.get(url,headers,proxies)得到一个response对象。
接下来使用BeautifulSoup函数方便解析html

link=[]
for links in ty_soup.find_all(target="_blank"):
    link.append(links.get("href"))
tylist=[]
for x in link:
    new=re.sub("../lyrics","https://www.azlyrics.com/lyrics",x)
    tylist.append(new)

虽然不知道是怎么回事,但是所有定向到歌词子界面的tag都有target="_blank"这个特征,所以就姑且拿来用吧。
(本来是想用正则的)
既然知道了这么一个非常便利的特征,就很适合通过find_all()来提取一整个标签。接下来用.get()来获取href的值,添加到list中方便之后再用。

#去除歌词相同的remix版本
for song in tylist:
    if (re.search(".*remix.*",song))!=None:
        tylist.remove(song)
#获取歌词存入一个list
all_lyric=[]    
for tyhref in tylist:
    tylyrichtml=requests.get(tyhref,headers=headers,proxies=proxies)
    tylyric_soup=BeautifulSoup(tylyrichtml.content,'lxml')
    final_tylyric=tylyric_soup.get_text()
    all_lyric.append(final_tylyric)
print(all_lyric)

以上是一开始的思路。然而这网站我似乎永远也进不去了也只能算了。

所以只好临时换了一个网站(https://www.musixmatch.com/artist/),这个精致的网站果然是动态的,也就意味着本人的垃圾技术还没学会怎么抓静态网站就要学动态的了。行吧先搞起再说啊!

1.思路
访问歌手的主页
找到每首歌对应的href
打开这些链接用beautifulsoup提取一个叫mxm-lyrics__content的标签
整理后(去掉<br>之类的无关字符)把歌词分割成一大堆单词
统计次数

2.正片
2.1 使用requests获取网页内容
我们可以发现这个网站是动态的,非常麻烦,只有点击“load more”才能看到所有歌曲的列表。
不过其实本质还是可以看作一个静态网站,因为如果f12查看源代码就会发现,其实https://www.musixmatch.com/artist/歌手名字/从1开始的数字指向了不同的链接,每个链接里都有15首为上限的歌曲。
BeautifulSoup提取所有歌曲的子界面

2.2代码部分

import re
from bs4 import BeautifulSoup
import requests
import time
from collections import Counter


time.sleep(5)  
proxies={'http':'http://203.146.82.253:3128','http':'http://145.239.93.189:80','http':'http://203.74.4.7:80','http':'http://36.83.69.97:80'}
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36' }

#home page of the artist
url="https://www.musixmatch.com/artist/Troye-Sivan"

#get the complete song list
urlset=[url+"/{}".format(i) for i in range(1, 10)] #唱了150首以上歌的人还挺少的
lyric_dict={}
for url_forload in urlset:
    ty=requests.get(url_forload,headers=headers,proxies=proxies)
    time.sleep(3)
    tysoup=BeautifulSoup(ty.content,"lxml")
    finalsoup=tysoup.find_all("a",class_="title")
    
    #find tags contain links of songs  
    for tag in finalsoup:
        links=tag.get("href")
        if (re.search(".*remix.*",links))==None:
            #requests only understands links start with "http"
            lyric_dict[re.sub("/lyrics","https://www.musixmatch.com/lyrics",links)]=_
        if tysoup.find(class_='empty')!=None:
            #stop reading when there's no more song 
            break

    


#get a list of lyrics to process later        
        

def get_lyric_musix(url):
    music_soup=BeautifulSoup(url,'lxml')    
    music_content=music_soup.find_all(class_='mxm-lyrics__content ')
    return ([content.get_text() for content in music_content])



for url in list(lyric_dict.keys()):
    tycontent=requests.get(url,proxies=proxies,headers=headers).content
    time.sleep(3)
    finalsoup=get_lyric_musix(tycontent)
    lyric_dict[url]=re.sub("\s+"," ",re.sub(r"[!?,.\"']","",re.sub(r"\n"," ","".join(finalsoup)))).lower()
    
    #remove useless parts
    
#get every single word to count frequency
lyricswords=[]
for lyric in lyric_dict.values():
    lyricswords=lyricswords + lyric.split(' ')
    
#the 300 most frequent words    
ly_frenquency=Counter(lyricswords).most_common(300)

for item in ly_frenquency:
    print(re.sub(r"[()']",'',str(item)))

2.3稍微改进一下
其实随便改一下就能变成输入歌手名字批量下载:
(后来发现其实大小写不分也毫无关系)

name=re.sub(r' ','-',str(input("Singer's name").title()))
url="https://www.musixmatch.com/artist/"+name

3.结果
事实上就是,戳爷的歌词里也没有那么多游泳池
筛选了前300个频率最高的单词中甚至没有网易云评论中经常被吐槽的summer
比如说:(去掉了一些你我他之类的常用词)

love, 144
youth, 106
wild, 96 ←总觉得只是因为you got me wild wild wild
running, 60
blue, 42  ←blue竟然这么多我都惊了
driving, 35
fools, 33
lost, 30
boy, 28
heart, 25
eyes, 24
kiss, 21
truth, 20
stars, 19
lights, 17
crawling, 16
fire, 16
twelve, 16
twenty, 16
colour, 12
pools, 12
swimming, 12 ←大家最爱的游泳池 其实也没有特别多
boys, 12
moon, 12
shooting, 12
wave, 11
tear, 11
sun, 11
dreams, 11
sleepin, 10
waterfalls, 10
rifles, 8
june, 8
clean, 8
gasoline, 8
seat, 8
pillow, 7
pill, 7
bathe, 7

总而言之精选的这些还是挺夏天挺青春的,不过出现了一个问题就是boys不知道为什么出现了两次。
看完戳爷的反正写了也是放着浪费就拿来爬了一下霉霉的:
霉霉相比之下歌词不是很有套路 ,第三百名直接频率就两次了(戳爷的话是7次)

shake, 70
trouble, 32
baby, 29
blood, 16
play, 16
ill, 15
break, 15
fake, 15
gorgeous, 13
mad, 8
ex-lovers, 6
players, 6
insane, 6
shame, 6
high, 6
romeo, 6
young, 5

下面开始几乎就都是2次了在此略过。第一名shake差点喷了好吧,查了一下真的70个都是shake it off里的。
本来还想继续看看黄老板啥的,发现可能是被发现我是机器人了就……等下次去学校了再研究吧。

这些流行歌手可能还是没多大意思,说唱歌词的内容或许会更丰富。不过总觉得这样一来就很复杂(引号不能瞎删除了),也许就需要研究一下代码之外的东西了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 我发现之前自己真是太愚蠢了没有搞清楚正则表达的各种用法。不同词语的筛选根本不用像re.sub('另一个想替换的内容...
    色拉丼阅读 330评论 0 0
  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,700评论 6 28
  • 天黑请闭眼...不然...你会失眠。完。
    62edb4d6ac50阅读 233评论 0 0
  • 文|夏夏&浅夏 你是否曾经一个人走着,在风吹来的时候,试着闭上眼睛?当太阳如此接近地平线,幸好能让看著这个方寸天地...
    五月之夏电台阅读 309评论 1 1
  • 昨晚与北京来的老爷子相聚,老爷子玩笑说我没有躺着的命。 哈哈,命这个东西,一辈辈说下来,有时候我都恍惚它的玄乎。 ...
    Odelia阅读 219评论 0 0